我正在尝试创建一个名为redundancy的规则,该规则检查列表,以查看两个元素是否出现在多个列表中。
这是我的代码:
columns([a,b,c]).
columns([b,c,d]).
in(X, [H|_]) :-
X = H.
in(X, [_|T]) :-
in(X, T).
redundancy(X, Y) :-
columns(A),
columns(B),
A \= B,
X \= Y,
in(X, A),
in(X, B),
in(Y, A),
in(Y, B).问题是约束X \= Y。我希望在其中排除X和Y是相同元素的实例,这对于出现在多个列表中的所有单个元素都是正确的。但是它只对给定的columns返回false,即使它应该返回b和c的排列。
?- redundancy(U, T).
false.如果我注释掉约束,就会得到预期的元素以及上面提到的不想要的元素。
?- redundancy(X, Y).
X = Y, Y = b ;
X = b,
Y = c ;
X = c,
Y = b ;
X = Y, Y = c ;
X = Y, Y = b ;
X = b,
Y = c ;
X = c,
Y = b ;
X = Y, Y = c ;
false.有办法强制执行这个约束吗?我也对将结果限制在给定的元素组合而不是排列的想法感兴趣。
发布于 2018-07-11 22:21:08
只需将X \= Y移动到谓词的最后一行即可。另外,请参阅prolog-dif和实例化-错误。
要避免的事情是使用非纯谓词和尚未实例化的逻辑变量(除非这正是您想要的,并且您知道自己在做什么)。
另外要注意的是,X \= Y不是一个约束(即dif),而是一个检查。
https://stackoverflow.com/questions/51291177
复制相似问题