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

我无法理解Prolog如何知道DFA接受规则中的开始状态,prolog,dfa,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).

我用我能想到的最好的方式写了标题,但让我说清楚。在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),那个么start(StartState)是怎样的呢。是吗?

这是最琐碎最基本的事情:给定一个事实

start(q0).
查询:

?- start(State).
成功并产生
State=q0
,这显然可以从给定的事实中推断出来,因为这正是事实所说的:
start(S)
true
如果
S=q0


以声明的方式阅读您的条款,例如:如果
开始(状态)
保持,并且从
状态开始接受
符号,则然后
接受(符号)
保持。试着以同样的方式阅读其他条款,它们所说的内容就会变得清晰。

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

你会问,“如果我从以下事实开始:
start(q0)。
,那么
start(StartState)是怎样的?
true?”

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

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

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

Prolog如何找到事实
开始(q0)
?确实如此。这是一个给定Prolog实现的细节。它在所有事实和规则中找到它,这些事实和规则构成了我们编写并加载到Prolog中的程序

现在,系统将
start(q0)
start(X)
匹配。这就是所谓的统一:

此操作成功,使用
X=q0
。logvar
X
被赋值,匹配成功。因此,通过替换
{X=q0}
验证了查询

Prolog就是这样工作的


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

@capelical我想OP的意思是他们理解它的意图,它应该做什么。英语是一种易变的语言,它可以用许多微妙的不同方式来解析。是的,当然这就是我的意思。谢谢你的意志。
start(q0) = start(X)