我是prolog的新手,我似乎无法理解结构和谓词之间的区别.真的有什么区别吗?
虽然挖掘我发现有些人认为 f(X): - (X) 是一个谓词,有些人认为是 嫉妒(X,Y): - 喜欢(X,Z),喜欢(Y,Z) 是一个结构(或复杂的术语).他们对我看起来几乎一样.
有人在意解释吗?
lur*_*ker 14
在Prolog中,术语是常数,原子,变量或复合词.
阿化合物术语由一个的算符 1个或多个参数.以下是条款:
a. % a term with functor 'a' and 0 arguments
a(b,c). % a term with functor 'a' and 2 arguments, b and c
Run Code Online (Sandbox Code Playgroud)
空列表[]是术语,更具体地说,是原子.列表[H|T]本质上表示'.'(H, T)为,因此是复合术语,因此也是术语.
您还可以使用更复杂的复合词:
a(b(c,d), e(f,g(h)))
Run Code Online (Sandbox Code Playgroud)
这里a是一个带有两个参数的仿函数:b(c,d)和e(f,g(h)),等等.
一个复合词,也被称为结构,因为他们给你一个方法来组织的事实:
customer(name(john,doe), address(street('123 Main St'), city('Framusville'), ...), ...).
Run Code Online (Sandbox Code Playgroud)
甲谓词子句是特定结构或术语.在Prolog中,一切都是形式的结构或术语:functor(arg1, arg2, ...).
我们来看看谓词子句:
f(X) :- a(X).
Run Code Online (Sandbox Code Playgroud)
它本身是一个结构,其内部被表示为这样的术语::-(f(X), (a(X))).句点(.)是终止符.正如@false所表明的那样,它是谓词的原因是:
它处于"顶级"(不是更高级别的论据)
它的算子是 :-
甲谓词子句也被称为规则,因为该术语,:-(A, B)定义了关系:A是真,如果B为真.该术语f(X)称为谓词子句的头部.
一个或多个谓词子句的集合,它们的头部都具有相同的functor和arity(参数个数),称为谓词.
看看你的第二个例子:
jealous(X,Y) :- loves(X,Z), loves(Y,Z).
Run Code Online (Sandbox Code Playgroud)
这也是一个谓词子句为谓词 jealous/2(所述谓词其函子是jealous和具有2元数).它将在内部表示为这个复合词::-(jealous(X,Y), ','(loves(X,Z), loves(Y,Z))).这意味着上述表达式也是复合词.
您可以使用以下命令查看Prolog如何以规范形式查看表达式write_canonical/1:
| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))
Run Code Online (Sandbox Code Playgroud)
SWI Prolog网站有一个非常好的Prolog术语表.
| 归档时间: |
|
| 查看次数: |
2697 次 |
| 最近记录: |