Prolog谓词逻辑(否定)疑问:规则not(b(X)):-d(X,_)是否有误?
你的Prolog规则
not(b(X)):-d(X,_)确实存在错误 原逻辑命题解析
原任务中的第一个核心命题是:如果X对Y感兴趣,那么X要么报名Y课程,要么懒惰(对应你定义的谓词逻辑:d(X,Y) → (a(X,Y) ∨ ¬b(X)),因为b(X)表示“X不懒惰”,所以“X懒惰”等价于not(b(X)))。
你的规则问题所在
你把这个“或”关系的命题拆成了两条独立的蕴含规则:
a(X,Y):-d(X,Y).(意为:只要X对Y感兴趣,就一定报名Y课程)not(b(X)):-d(X,_).(意为:只要X对任意事物感兴趣,就一定懒惰)
这完全违背了原命题的“二选一”逻辑——原命题是两种情况至少满足其一,而非两种情况同时成立或各自独立被蕴含。
为什么查询结果看似正确?
你添加了事实b(david).(David不懒惰),当查询a(david,logic)时:
- Prolog通过
c(david,logic)和d(X,Y):-c(X,Y).推出d(david,logic)为真; - 直接通过
a(X,Y):-d(X,Y).得到结果为true。
这只是巧合:因为b(david)为真,not(b(david))会失败,所以错误规则的矛盾没暴露。但如果去掉b(david).这条事实,你的规则会同时推出a(david,logic)和not(b(david))都为真,这显然不符合原命题“要么报名要么懒惰”的要求。
正确的Prolog写法
原命题的正确子句形式应该直接表达“或”关系:
% 正确表达:如果X对Y感兴趣,那么X要么报名Y课程,要么懒惰 a(X,Y); not(b(X)) :- d(X,Y). % 其余规则和事实保持不变 d(X,Y) :- c(X,Y). c(david, logic). b(david).
测试?-a(david,logic).依然会返回true:因为b(david)为真,not(b(david))不成立,Prolog会回溯到a(X,Y)分支,结合d(david,logic)的事实,推导完全符合原逻辑。
内容的提问来源于stack exchange,提问作者Smth_Unknown
相关产品推荐
相关产品推荐

