【问题标题】:Rule to test whether two lists contain same two elements fails due to uniqueness constraint由于唯一性约束,测试两个列表是否包含相同的两个元素的规则失败
【发布时间】: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,即使它应该返回bc 的排列。

?- 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


【解决方案1】:

只需将X \= Y 移动到谓词的最后一行。另见

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2010-11-19
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多