0

我需要在 SWI-Prolog 中编写自己的 all_different 版本。我写了一个谓词,它在我提供的输入上返回与 all_diff 相同的真/假,但是我在网上找不到一种方法来实际应用这个谓词作为约束。这是我的 all_diff 版本.

distinct([]).
distinct([X|Xs]) :-
  different(X,Xs),
  distinct(Xs).

different(_,[]).
different(X,[Y|Ys]) :-
  (nonvar(X), nonvar(Y) -> X \= Y
   ;
   true
  ),
  different(X,Ys).

我需要将它应用于整数列表和_。是的,这就是数独程序项目。对不起,如果这是一个愚蠢的问题,但我对 Prolog 还是很陌生,我发现很难在网上找到足够的文档。请帮忙!

4

1 回答 1

2

你写了一个谓词而不是一个约束。简而言之,谓词要么成功,要么失败,而约束仅表示对可能值的限制。约束的求解器正在记录约束,该求解器使用一些黑魔法来简化它们并指示所涉及变量的可能值范围。因此,您不能将谓词用作约束。

您可以重新考虑原始问题并检查是否需要约束,或者按如下方式修改上面的实现(我使用的是 SWI-Prolog):

different(X,[Y|Ys]) :-
  X#\= Y,
  different(X,Ys).

#\=表示不等式表达式是一个约束。

您可能想查看http://www.swi-prolog.org/man/clpfd.htmlall_different/1 ,特别是和之间的区别all_distinct/1

于 2012-04-29T07:54:32.460 回答