我对prolog很陌生,我似乎无法理解结构和谓词之间的区别。真的有什么区别吗?
在研究时,我发现有些人认为f(X):-a(X)是谓词,而有些人认为妒忌(X,Y):-(X,Z),爱(Y,Z)是一个结构(或复杂的术语)。在我看来它们看起来差不多。
有人想解释一下吗?
发布于 2015-03-10 19:40:23
在Prolog中,术语是常数、原子、变量或复合项。
复合项由一个具有一个或多个参数的函子组成。以下是术语:
a. % a term with functor 'a' and 0 arguments
a(b,c). % a term with functor 'a' and 2 arguments, b and c空列表[]是术语,更具体地说,是一个原子。列表[H|T]本质上表示为'.'(H, T),因此是一个复合项,因此也是一个术语。
你也可以有更复杂的复合词。
a(b(c,d), e(f,g(h)))在这里,a是一个函子,有两个参数:b(c,d)和e(f,g(h)),等等。
复合术语也可以称为结构,因为它们给了你一种构造事实的方法:
customer(name(john,doe), address(street('123 Main St'), city('Framusville'), ...), ...).谓词子句是一个特定的结构或术语。在Prolog中,一切都是表单的结构或术语:functor(arg1, arg2, ...)。
让我们看一下谓词子句:
f(X) :- a(X).它本身就是一个内部表示为这个术语的结构::-(f(X), (a(X)))。句点(.)是终止符。如@false所示,使它成为谓词的原因是:
:-谓词子句也被称为规则,因为该术语:-(A, B)定义了关系:如果A为true,则B为true。术语f(X)被称为谓词子句的头。
一个或多个谓语从句的集合,对于它们的头都具有相同的函子和性(参数的数目),被称为谓词。
看第二个例子:
jealous(X,Y) :- loves(X,Z), loves(Y,Z).这也是谓词jealous/2的一个谓词子句(该谓词的函子为jealous,其重要性为2)。在内部,它将被表示为以下复合术语::-(jealous(X,Y), ','(loves(X,Z), loves(Y,Z)))。这意味着上面的表达式也是一个复合词。
您可以通过使用write_canonical/1查看Prolog如何以其规范形式查看表达式。
| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))SWI站点有一个非常好的Prolog术语汇编。
https://stackoverflow.com/questions/28972038
复制相似问题