【问题标题】:building FSA in prolog在序言中构建 FSA
【发布时间】:2016-08-30 19:23:18
【问题描述】:

我被要求在 prolog 中代表 FSA。

  • fsa 是状态列表。
  • 状态是具有函子状态和 3 个参数的结构:名称、列表 转换,是或否表示状态是接受还是 不是。
  • 转换是具有函子转换和 2 个参数的结构:从、 一个字符,一个州名。

我们的 FSA 没有 epsilon 移动。

nondfsa(FSA) 如果 FSA 是不确定的,则为真。完成 nondfsa。提示:使用 辅助谓词nondstate(State),如果 State 具有非确定性,则为 true 过渡。您可以为谓词添加子句。`

我得到的答案如下:

nondfsa([Hstate | _ ])
    :- nondstate(Hstate).
nondfsa([ _ | Tailstates]) :-
    nondfsa(Tailstates).

nondstate(state( _ , Transitions, _ )):-
    member(transition(Char, To1), Transitions),
    member(transition(Char, To2), Transitions),
    not(To1 = To2).

谁能帮我解释一下每个谓词在做什么?我对这些行的确切含义感到非常困惑。

我了解如果至少一个状态具有多个具有相同字符的转换,则没有 epsilon 移动的 fsa 是不确定的。 我只是不明白这段代码发生了什么。

【问题讨论】:

  • 我得到了答案是什么意思?想出这个答案是你的任务,还是他们在课堂上提供的,你应该分析它?
  • @lurker 用于练习期末考试,任务是提供代码并检查您的工作,他们会为您提供正确的答案。我只是不太明白他们是怎么想出来的,以及它到底在做什么

标签: prolog finite-automata


【解决方案1】:

提供的代码非常简单,学习“通读”Prolog 谓词会很好。

nondfsa([Hstate | _ ]) :-
    nondstate(Hstate).
nondfsa([ _ | Tailstates]) :-
    nondfsa(Tailstates).

这是一种非常常见的 Prolog 模式,它递归地检查列表中的每个元素以查找某些内容。 nondfsa/1 检查列表的每个元素。如果其中任何是非确定性状态(根据nondstate/1),则nondfsa/1 成功,这意味着FSA 是非确定性的。如果nondstate/1 对给定列表中的any 元素不成功,则nondfsa/1 将失败。第一个子句检查列表的头部。第二个子句跳过头部并检查列表的其余部分。在递归调用中,Prolog 再次从第一个子句开始,因此它只是通过nondstate/1 检查下一个元素。

nondstate(state( _ , Transitions, _ )):-
    member(transition(Char, To1), Transitions),
    member(transition(Char, To2), Transitions),
    not(To1 = To2).

nondstate/1 如果发现给定的state/3 根据某些仅取决于该状态转换的定义是非确定性的,则nondstate/1 成功。如果您通读 nondstate/1 谓词,您可以看到这是什么。如果满足以下条件,则谓词成功:

  1. 我可以获得转换列表的成员
  2. 我可以使用 相同的字符 获得转换列表的另一个成员(这将始终成功至少一次,使用与 #1 中相同的成员)
  3. 两个成员各自的目标状态不同

换句话说,如果有一个角色至少转换到两个不同的状态,那么一个状态就是不确定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多