序言。结构(复杂术语)与谓词,我真的不明白区别
Prolog. Structure(complex term) vs predicate, i dont really get the difference
我是 prolog 的新手,我似乎无法理解结构和谓词之间的区别。
真的有区别吗?
在四处挖掘时,我发现有些人认为
f(X):-a(X) 是一个谓词,有些人认为
jealous(X,Y):-loves(X,Z), loves(Y,Z) 是一个结构(或复数项)。它们在我看来几乎一样。
有人愿意解释一下吗?
在 Prolog 中,项 是常数、原子、变量或复合项。
一个复合词由一个函子和一个或多个参数组成。以下是项:
a. % a term with functor 'a' and 0 arguments
a(b,c). % a term with functor 'a' and 2 arguments, b and c
空列表 []
是 term,更具体地说,是一个 atom。列表 [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 中,一切都是 structure 或 term 形式:functor(arg1, arg2, ...)
.
我们来看谓词从句:
f(X) :- a(X).
它本身就是一个结构,在内部表示为这个项::-(f(X), (a(X)))
。句点 (.
) 是终止符。是什么让它成为 谓词,正如@false 所指出的,是:
在"top level"(不是更高层次的论点)
它的函子是:-
A predicate clause 也称为 rule 因为术语 :-(A, B)
定义了 关系:如果B
为真,则A
为真。术语 f(X)
被称为谓词从句的 head。
一个或多个谓词子句的集合,它们都具有相同的函子和arity(参数数量)他们的头被称为谓词。
看你的第二个例子:
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 站点有一个很好的glossary of Prolog terms。
我是 prolog 的新手,我似乎无法理解结构和谓词之间的区别。 真的有区别吗?
在四处挖掘时,我发现有些人认为 f(X):-a(X) 是一个谓词,有些人认为 jealous(X,Y):-loves(X,Z), loves(Y,Z) 是一个结构(或复数项)。它们在我看来几乎一样。
有人愿意解释一下吗?
在 Prolog 中,项 是常数、原子、变量或复合项。
一个复合词由一个函子和一个或多个参数组成。以下是项:
a. % a term with functor 'a' and 0 arguments
a(b,c). % a term with functor 'a' and 2 arguments, b and c
空列表 []
是 term,更具体地说,是一个 atom。列表 [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 中,一切都是 structure 或 term 形式:functor(arg1, arg2, ...)
.
我们来看谓词从句:
f(X) :- a(X).
它本身就是一个结构,在内部表示为这个项::-(f(X), (a(X)))
。句点 (.
) 是终止符。是什么让它成为 谓词,正如@false 所指出的,是:
在"top level"(不是更高层次的论点)
它的函子是
:-
A predicate clause 也称为 rule 因为术语 :-(A, B)
定义了 关系:如果B
为真,则A
为真。术语 f(X)
被称为谓词从句的 head。
一个或多个谓词子句的集合,它们都具有相同的函子和arity(参数数量)他们的头被称为谓词。
看你的第二个例子:
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
:
| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),','(loves(_17,_22),loves(_18,_22)))
SWI Prolog 站点有一个很好的glossary of Prolog terms。