我有代码
newplan(State, [c(StateList)], [], State):- 满意(State, StateList)。
而且我不知道 c() 谓词的作用。我试图在互联网上搜索答案,但我找不到。请帮我。
我有代码
newplan(State, [c(StateList)], [], State):- 满意(State, StateList)。
而且我不知道 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
没有做任何事情。如果您查询something_to_do/1
,您将获得结构:
?- something_to_do(X).
X = c(14) ;
X = q(21) ;
false.
但是,如果您随后将该结构传递给eval/2
它,则取决于它获得的结构。所以你可以说eval/2
赋予结构q/1
和c/1
意义(尽管“赋予意义”在任何意义上都不是官方 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 的那些有趣而令人困惑的事情之一(后来证明它是强大而伟大的)。创建结构和尝试统一目标之间存在巨大差异。