【发布时间】:2018-07-11 17:24:45
【问题描述】:
我正在尝试创建一个名为 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.
有没有办法强制执行这个约束?我也对将结果限制为给定元素组合而不是排列的想法感兴趣。
【问题讨论】:
-
当我接受您的建议并将谓词切换为 dif 或 \== 时,它起作用了。如果您想让您的评论成为答案,我会接受。谢谢。
标签: prolog