我无法理解Prolog如何知道DFA接受规则中的起始状态

时间:2013-10-28 06:56:29

标签: prolog dfa

我的头衔是我能想到的最佳方式,但让我说清楚。在Prolog中编程DFA时,这是一种典型的方式:

start(q0).
final(q2).

transition(q0, a, q1).
transition(q1, b, q1).
transition(q1, c, q2).

accept(Symbols) :- start(StartState), accept(Symbols, StartState).

accept([], State) :- final(State).

accept([Symbol|Symbols], State) :- transition(State, Symbol, NextState), 
                                accept(Symbols, NextState).

我理解这段代码的作用,目标是什么,以及所有这些。令人难以理解的是“接受”规则。同样,我理解正在执行的操作背后的逻辑,但我不明白的是突然使用StartState和NextState。这些都是冒出来的,我不明白start(StartState)甚至会如何返回true,更不用说值来自哪里了。与使用NextState相同。 Prolog“思考”了什么价值观,以及它们如何被过渡事实所接受?

如果我从事实开始:start(q0)。,那么如何启动(StartState)。真?

2 个答案:

答案 0 :(得分:3)

虽然mat的答案是正确的,但我会在这里给你一些操作语义,即 是如何发生的。

你问,“如果我从事实开始:start(q0).,那么start(StartState).如何成真?”

答案:StartState逻辑变量。它还没有设置任何值。我们写下这个名字,“无处不在” - 它可以是我们选择的任何名字; Prolog看到它,看到它是一个新名称(以大写字母开头),并创建一个具有该名称的新logvar,它尚未实例化(赋值)。它就像一个NULL指针,可以在以后只设置一次(除非系统回溯,但这是一个正交问题)。

这就是Prolog的工作方式:它会看到一个查询,start(X);它看到X是一个新的logvar;现在它试图证明这个查询。这意味着,它使用 head 搜索所有已知的事实和规则,匹配我们的查询。

有一个:事实start(q0)。注意q0以小写字母开头。这意味着它是一个 atom ,一个符号数据。变量以大写字母开头。

Prolog如何找到事实start(q0)?它就是这样。这是给定Prolog实现的细节。它在构成我们编写的程序的所有事实和规则中找到它,并加载到Prolog中。

现在系统将start(q0)start(X)匹配。这称为统一

start(q0) = start(X)

这成功,X = q0。 logvar X被赋值,并且匹配成功。因此,使用替换 { X = q0 }验证了查询。

这就是Prolog的工作原理。

但实际上,您应该阅读一本很好的Prolog教程,以便您理解上述所有斜体字样。之后会有更多的问题需要学习,所以你最终可以确信你“理解”了Prolog。

答案 1 :(得分:2)

那真的是最琐碎和最基本的事情:给出一个事实

start(q0).

查询:

?- start(State).

成功会产生State = q0,这显然可以从给定的事实中推断出来,因为这正是事实所说的:start(S)true < strong> if S = q0

以声明方式阅读您的子句,例如:如果 start(State)持有 SymbolsState开始接受,然后 accept(Symbols)成立。尝试以相同的方式阅读其他条款,并且将清楚他们所说的内容。