关于prolog中的c()谓词

关于prolog中的c()谓词,prolog,Prolog,我有密码 新计划(状态[c(状态列表)],[],状态):-满足(状态,状态列表) 我不知道c()谓词做什么。我试图在网上搜索答案,但找不到。请帮帮我。在这个代码中,c/1只是一个结构。Prolog与大多数语言略有不同,因为结构和谓词(在另一种语言中可能被认为是函数调用)共享语法。所以这里c/1没有任何作用,它只是一个标记,它(大概)通过代码中的其他东西被赋予了意义,而您没有与我们共享 让我给你举个具体的例子 eval(c(X), X2) :- X2 is (X*2) + 3. eval(q(X)

我有密码

新计划(状态[c(状态列表)],[],状态):-满足(状态,状态列表)


我不知道c()谓词做什么。我试图在网上搜索答案,但找不到。请帮帮我。

在这个代码中,
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/1
q/1
不执行任何操作。如果您查询
要做的事情/1
,您将返回以下结构:

?- something_to_do(X).
X = c(14) ;
X = q(21) ;
false.
但是,如果您随后将该结构传递给
eval/2
,它将根据得到的结构执行某些操作。因此,你可以说
eval/2
赋予结构
q/1
c/1
以意义(尽管“灌输意义”在任何意义上都不是官方序言术语)

这里的情况也一样。您必须搜索您的代码库并找出
c/1
在其中的含义,因为它不是一个内置谓词

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

q(foo).
q(bar).
q(X) :- even(X).
这个谓词在任何意义上都不会与上面的
q/1
结构重叠。这只是关于Prolog的有趣而混乱的事情之一(后来证明它是强大而宏大的)。创建结构和试图统一目标之间存在着巨大的差异

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