prolog查询中的否定无效
嗨,我有一个简单的知识数据库,定义如下:prolog查询中的否定无效,prolog,logic,negation,prolog-dif,prolog-toplevel,b-prolog,sicstus-prolog,swi-prolog,xsb,Prolog,Logic,Negation,Prolog Dif,Prolog Toplevel,B Prolog,Sicstus Prolog,Swi Prolog,Xsb,嗨,我有一个简单的知识数据库,定义如下: 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”上且不是“big”的carClass 我
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”上且不是“big”的carClass
我正在尝试使用以下方法实现它:
OnOilButNotBig :-
carClass(CarClass,'oil',_),
carClass(CarClass,'oil', \+('big') ),
write(CarClass).
但这是行不通的。你必须理解谓词和函子之间的区别 如果我们稍微简化一下,谓词是顶层的标识符,因此
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).
最后,如前所述,谓词和函数需要使用以小写字母开头的名称。首先
- 代码无法编译1。
为什么?谓词名称通常以小写字符2开头
我的建议是:不要写
而写OnOilButNotBig
OnOilButNotBig
- 要表达术语不平等,请使用正确的目标,如: onOilButNotBig :- dif(X, big), carClass(CarClass, oil, _), carClass(CarClass, oil, X), write(CarClass). onOilButNotBig:- dif(X,大), 汽车级(汽车级、机油级、, carClass(carClass,机油,X), 写(CarClass)。
- 顺便说一句,您的代码还有一些问题:
- 仅在必要时使用基于副作用的I/O 在大多数情况下,最好使用interactive进行数据输入/输出 onOilButNotBig(CarClass) :- dif(X, big), carClass(CarClass, oil, _), carClass(CarClass, oil, X). onOilButNotBig(CarClass):- dif(X,大), 汽车级(汽车级、机油级、, carClass(carClass,oil,X)。
- 为了便于阅读,请不要使用原子,如
和'oil'
选择一个'oil'
机油(小写)
目标carClass(carClass,oil,)
是完全冗余的
为什么??这是近距离目标的概括carClass(carClass,oil,X)
脚注1:使用8.1、4.3.2、7.3.14和3.6时。
脚注2:如果使用右边(用单引号转义),名称也可以以大写字符开头。
脚注3:一般来说,多余的目标是可以的,但它们向我建议,您的代码可能不会按预期的方式运行。