将L实例化为数字列表Prolog

时间:2014-05-17 14:49:37

标签: prolog clpfd

如果我有以下数据库:

digit(0).
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).

我想要查询

digits([X,Y]). 

通过将X和Y实例化为10 * 10 = 100个不同的数字组合来成功,我将如何解决这个问题?

我是否需要对此使用有限域约束,例如

L ins 0..9

提前谢谢

2 个答案:

答案 0 :(得分:2)

你不需要clpfd来做到这一点。您可以使用更高的顺序来获得富有表现力的解决方案:

digits(L) :- maplist(digit, L).

您也可以自己进行递归:

digits([]) :- [].
digits([H|T]) :- digit(H), digits(T).

答案 1 :(得分:2)

使用很简单:

?- use_module(library(clpfd)).
true.

?- length(Zs, 3), Zs ins 1..2, labeling([], Zs).
  Zs = [1,1,1]
; Zs = [1,1,2]
; Zs = [1,2,1]
; Zs = [1,2,2]
; Zs = [2,1,1]
; Zs = [2,1,2]
; Zs = [2,2,1]
; Zs = [2,2,2].