我有一个有点复杂的谓词,当第一个和最后一个参数都是地面/非地面,而不是地面/地面或地面/地面,并且第二个和第三个参数都是接地时,需要工作的四个参数。
即。谓词(A,B,C,d)。
我无法提供实际代码,因为它是作业的一部分。
我主要使用它,但是当A没有接地时,我接收到实例化错误,但是D是。但是,我已经挑出了导致问题的一行代码。当我改变谓词的目标顺序时,它在D是地面且A不是时起作用,但是在这样做时,它不再适用于A是地面而D不是。我不确定是否有解决方法。
有没有办法使用两行代码,以便如果A是地面的,例如它将使用第一行,但如果A不是地,它将使用第二行,并忽略第一行?反之亦然。
答案 0 :(得分:4)
你可以这样做,但是,几乎总是会破坏程序的声明性语义如果你这样做。
考虑一个简单的例子,看看这种非单调和逻辑外的谓词如何已经打破了众所周知的谓词的基本假设和典型的声明性属性,比如连词的交换性:
?- ground(X), X = a. false.
但是,如果我们只是通过连词的交换来交换目标,我们会得到不同的答案:
?- X = a, ground(X). X = a.
出于这个原因,最好避免使用这种元逻辑谓词,特别是如果你刚开始学习这门语言的话。
相反,更好地留在Prolog的纯粹和单调的子集中。使用约束,如dif/2
和CLP(FD),使您的程序可以在所有方向上使用,从而提高通用性和易于理解。
有关详细信息,请参阅logical-purity,prolog-dif和clpfd。