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:一般来说,多余的目标是可以的,但它们向我建议,您的代码可能不会按预期的方式运行。