首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规则来测试两个列表是否包含相同的两个元素,是否由于唯一性约束而失败。

规则来测试两个列表是否包含相同的两个元素,是否由于唯一性约束而失败。
EN

Stack Overflow用户
提问于 2018-07-11 17:24:45
回答 1查看 59关注 0票数 1

我正在尝试创建一个名为redundancy的规则,该规则检查列表,以查看两个元素是否出现在多个列表中。

这是我的代码:

代码语言:javascript
复制
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,即使它应该返回bc的排列。

代码语言:javascript
复制
?- redundancy(U, T).
false.

如果我注释掉约束,就会得到预期的元素以及上面提到的不想要的元素。

代码语言:javascript
复制
?- 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.

有办法强制执行这个约束吗?我也对将结果限制在给定的元素组合而不是排列的想法感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 22:21:08

只需将X \= Y移动到谓词的最后一行即可。另外,请参阅prolog-dif实例化-错误

要避免的事情是使用非纯谓词和尚未实例化的逻辑变量(除非这正是您想要的,并且您知道自己在做什么)。

另外要注意的是,X \= Y不是一个约束(即dif),而是一个检查。

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

https://stackoverflow.com/questions/51291177

复制
相关文章

相似问题

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