首页 > 解决方案 > 序言中的局部否定

问题描述

我正在尝试编写一些规则来说明堆栈中的块数(不是数据结构,只是一个位置)。规则堆栈为堆栈中的每个块返回 true。具体来说,X 中的块数是零/一/二吗?

num_blocks(X,zero) :- \+stack(X,_).
num_blocks(X,one) :- stack(X,A),\+stack(X,B),A\=B.

所以,num_blocks(X,zero)按预期工作,但另一个没有。我的想法是,如果我们能找到一个块(A)而我们找不到第二个唯一的块(B),那么 X 堆栈中只有一个块。但是,我仍然不断false回来。

标签: prolog

解决方案


您的意图(根据您的描述)是检查堆栈中是否没有其他块。但是您只是不适用于堆栈(X,B),这意味着堆栈X中没有块,并且它\+stack(X,B)成功它将使B保持原样(未实例化)。

我认为你想要的第二个子句是堆栈(X,B)和A \ = B的合取的否定,即:

num_blocks(X,one) :- 
   stack(X,A),
   \+ ( stack(X,B), A\=B ).

推荐阅读