关于prolog中的c()谓词

时间:2013-04-23 02:07:10

标签: prolog

我有代码

  

newplan(State,[c(StateList)],[],State): - satisf(State,StateList)。

我不知道c()谓词是做什么的。我试图搜索互联网寻找答案,但我找不到。请帮帮我。

1 个答案:

答案 0 :(得分:0)

在此代码中c/1只是一个结构。 Prolog与大多数语言略有不同,因为结构和谓词(可能被认为是另一种语言中的函数调用)共享语法。所以这里c/1不会任何东西,它只是一个标记(可能)通过代码中的其他东西而不是与我们分享的意义。

让我举一个具体的例子。

eval(c(X), X2) :- X2 is (X*2) + 3.
eval(q(X), X2) :- X2 is X / 3.

something_to_do(c(14)).
something_to_do(q(21)).

在此代码中,c/1q/1不会执行任何操作。如果您查询something_to_do/1,您将获得结构:

?- something_to_do(X).
X = c(14) ;
X = q(21) ;
false.

但是如果你然后将那个结构传递给eval/2,它会根据它得到的结构做一些事情。所以你可以说eval/2使结构q/1c/1具有意义(尽管“imbuing meaning”在任何意义上都不是官方的Prolog命名法。)

?- something_to_do(X), eval(X, Y).
X = c(14), Y = 31 ;
X = q(21), Y = 7 ;
false.

这是同一个故事。您将不得不搜索代码库并找出其中c/1的含义,因为它不是内置谓词。

注意:可以在同一代码库中同时具有相同名称的结构和谓词。例如,我可以添加一个谓词

q(foo).
q(bar).
q(X) :- even(X).

并且此谓词在任何意义上都与上面的q/1结构不重叠。这只是关于Prolog的一些有趣的混乱事物之一(后来证明它是强大而宏伟的)。创建结构和尝试统一目标之间存在着巨大的差异。