因此被告知特定谓词必须以+,+模式工作。这在Prolog中意味着什么?
答案 0 :(得分:4)
当想要在prolog中提供有关谓词的信息时,通常会使用这些约定:
arity:谓词/ 3 表示谓词需要3个参数。
参数:谓词(+ Element,+ List,-Result)表示Element和List不应该是自由变量,Result应该是一个自由变量,谓词才能正常工作。 ?当它可以同时使用时,@在上面的答案中被提及但是实际上并没有被使用(至少在swi-pl doc中)并且意味着在调用期间输入不会被绑定。
告诉 somepredicate 在+,+模式下工作是告诉我们的快捷方式:
% somepredicate/2 : somepredicate(+Input1, +Input2)
答案 1 :(得分:4)
为了给你一个明确的答案,你需要告诉我们的不仅仅是+,+。对于参数只是原子的谓词,事物定义得很好:p(+,+)表示只应该用两个参数作为原子来调用谓词。
但是如果我们有,比如列表,事情就更复杂了。在这种情况下有两个含义。考虑成功member/2
的{{1}}。
查询member(2,[1,2,3])
或member(2,[X])
现在是+,+还是不?
ISO Prolog中也使用的直接解释(引用8.1.2.2论证模式,来自ISO / IEC 13211-1:1995):
member(2,[X|Xs])
论证应该被实例化,从这个意义上说,上面的两个查询都是+,+。
然而,还有另一种解释隐含地假设我们可以访问谓词的定义。这种解释源于DEC-10 Prolog的模式声明,这是最早的Prolog系统之一。我们来看看+
:
member/2
模式member(X, [X|_]).
member(X, [_|Xs]) :-
member(X, Xs).
现在意味着在执行目标时,此模式将适用于所有子目标。也就是说,member(+,+)
将是+,+而member(2,[X])
不是
因为它的子目标member(2,[X|Xs])
。
人们经常混淆这些观念。因此,当您谈论列表或其他复合词时,有助于询问其含义。
有关模式的更多信息,请参阅this answer。
答案 2 :(得分:3)
这意味着谓词的参数都是输入参数(虽然不是纯输入)。
This page对Prolog的所有呼叫模式都有一个简洁的描述。