我无法理解Prolog如何知道DFA接受规则中的开始状态
我用我能想到的最好的方式写了标题,但让我说清楚。在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).
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
。logvarX
被赋值,匹配成功。因此,通过替换{X=q0}
验证了查询
Prolog就是这样工作的
但实际上,您应该阅读一本好的Prolog教程,以便理解上面所有的斜体字。在那之后,还有更多的问题需要学习,所以你最终可以确信你“理解”了序言。@capelical我想OP的意思是他们理解它的意图,它应该做什么。英语是一种易变的语言,它可以用许多微妙的不同方式来解析。是的,当然这就是我的意思。谢谢你的意志。
start(q0) = start(X)