首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >prolog查询中的否定不起作用

prolog查询中的否定不起作用
EN

Stack Overflow用户
提问于 2016-01-03 12:59:35
回答 1查看 959关注 0票数 1

嗨,我有一个简单的知识库,定义为:

代码语言:javascript
运行
复制
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。

我正在尝试使用以下方法来实现它:

代码语言:javascript
运行
复制
OnOilButNotBig :-
   carClass(CarClass,'oil',_),
   carClass(CarClass,'oil', \+('big') ),
   write(CarClass).

但这不管用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-03 13:28:25

您必须理解谓词和函子之间的区别。

如果我们稍微简化一下,谓词就是顶层的标识符,所以carClass/3是谓词,write/1是谓词,onOilButNotBig/0是谓词。您可以调用谓词。带有填充参数的谓词是一个目标。

另一方面,函子是一个标识符,而不是顶层的标识符。常量是函子,变量是函子,带参数的函数是函子。函子的例子有'X1''oil'foo(X,bar,qux(2))

否定意味着一个目标。在这种情况下,'big'不是一个目标,实际上\+('big')本身就是一个函子。

您只能通过将条件转换为目标并确保调用它来解决这个问题。可以这样做:

代码语言:javascript
运行
复制
onOilButNotBig :-
   carClass(CarClass,'oil',_),
   carClass(CarClass,'oil',X),
   \+(X = 'big'),
   write(CarClass).

此外,我不太明白为什么要调用carClass/3两次。以下是一个同等的和稍微有效率的程序:

代码语言:javascript
运行
复制
onOilButNotBig :-
   carClass(CarClass,'oil',X),
   \+(X = 'big'),
   write(CarClass).

最后,正如@重复所指出的,您需要为谓词和函数使用以小写开头的名称。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34576794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档