我的头衔是我能想到的最佳方式,但让我说清楚。在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)。真?
答案 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)
持有且 Symbols
从State
开始接受,然后 accept(Symbols)
成立。尝试以相同的方式阅读其他条款,并且将清楚他们所说的内容。