嗨,我有一个简单的知识库,定义为:
carClass('X1','Oil','small').
carClass('X2','gas','big').
carClass('X3','Petrol','big').
carClass('X4','oil','small').
carClass('X5','Oil','small').
carClass('X6','gas','big').
我正在尝试写一条规则来回答这个问题:显示所有运行在“oil”上且不是“大”的carClass。
我正在尝试使用以下方法来实现它:
OnOilButNotBig :-
carClass(CarClass,'oil',_),
carClass(CarClass,'oil', \+('big') ),
write(CarClass).
但这不管用。
发布于 2016-01-03 13:28:25
您必须理解谓词和函子之间的区别。
如果我们稍微简化一下,谓词就是顶层的标识符,所以carClass/3
是谓词,write/1
是谓词,onOilButNotBig/0
是谓词。您可以调用谓词。带有填充参数的谓词是一个目标。
另一方面,函子是一个标识符,而不是顶层的标识符。常量是函子,变量是函子,带参数的函数是函子。函子的例子有'X1'
,'oil'
和foo(X,bar,qux(2))
。
否定意味着一个目标。在这种情况下,'big'
不是一个目标,实际上\+('big')
本身就是一个函子。
您只能通过将条件转换为目标并确保调用它来解决这个问题。可以这样做:
onOilButNotBig :-
carClass(CarClass,'oil',_),
carClass(CarClass,'oil',X),
\+(X = 'big'),
write(CarClass).
此外,我不太明白为什么要调用carClass/3
两次。以下是一个同等的和稍微有效率的程序:
onOilButNotBig :-
carClass(CarClass,'oil',X),
\+(X = 'big'),
write(CarClass).
最后,正如@重复所指出的,您需要为谓词和函数使用以小写开头的名称。
https://stackoverflow.com/questions/34576794
复制相似问题