在swipl中应用约束

时间:2012-04-29 05:15:01

标签: prolog

我需要在SWI-Prolog中编写我自己的all_different版本。我写了一个谓词,它在我给出的输入上返回相同的true / false,就像all_different一样,但是我在网上找不到实际应用这个谓词作为约束的方法。这是我的all_different版本

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的新手,我发现很难在网上找到足够的文档。 请帮忙!

1 个答案:

答案 0 :(得分:2)

您编写了谓词而非约束。简而言之,谓词要么成功要么失败,而约束只表示对可能值的限制。约束的解算器正在记录约束,它通过一些黑魔法来简化它们并指示所涉及变量的可能值范围。因此,您不能将谓词应用为约束。

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

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

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

您可能想查看http://www.swi-prolog.org/man/clpfd.html,特别是all_different/1all_distinct/1之间的差异。