Prolog中的+,+模式是什么意思?

时间:2011-11-27 02:00:41

标签: prolog iso-prolog

因此被告知特定谓词必须以+,+模式工作。这在Prolog中意味着什么?

3 个答案:

答案 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的所有呼叫模式都有一个简洁的描述。