在没有CLPFD库的情况下限制变量域

时间:2013-11-17 17:14:57

标签: prolog sudoku clpfd

我的程序中有一个变量列表,比如A,B,C,D,...,J,我需要将每个变量的域限制为同一组整数,比如1, 2,... 10.我知道有几种不同的方法可以做到这一点,但所有这些方法都使用CLPFD中的至少一种方法,例如X #> 0X ins [domain]fd_domain(args) 。我没有找到一种没有任何内置库的方法(所有这些都被禁止用于这个项目)。

我认为写这样的规则就足够了:

A > 0, A < 11, B > 0, B < 11, ..., J > 0, J < 11

但显然变量没有充分实例化。我知道这是一个非常简单的问题,但我一直在寻找自己一段时间,并且真的没有其他资源可以帮助。非常感谢。

1 个答案:

答案 0 :(得分:3)

SWI-Prolog中有between函数:

?- between(1, 9, A).
A = 1 ;
A = 2 ;
A = 3 ;
A = 4 ;
A = 5 ;
A = 6 ;
A = 7 ;
A = 8 ;
A = 9.

如果这也被禁止(它是非标准的),那么你使用member/2

?- member(A, [1, 2, 3, 4, 5, 6, 7, 8, 9]).
A = 1 ;
A = 2 ;
A = 3 ;
A = 4 ;
A = 5 ;
A = 6 ;
A = 7 ;
A = 8 ;
A = 9.

如果没有CLP(fd),你将被困在生成和测试范例中,也许最好找到一些解决方法,你可以通过临时方式检查变量值以获得不错的性能。