Prolog: Constraining the elements of a list to be within a range
是否有任何方法可以将列表的元素限制在一个范围内(看起来更像是
)
赞:
1 2 | all_between(Low, High, Vars) :- Vars ins Low..High. |
调用
1 2 3 | X1 in 1..6, X2 in 1..6, X3 in 1..6. |
如果要枚举元素,也可以使用
1 2 3 | all_between_enumerate(Low, High, Vars) :- Vars ins Low..High, label(Vars). |
对于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ?- all_between_enumerate(1,2,[X1,X2,X3]). X1 = X2, X2 = X3, X3 = 1 ; X1 = X2, X2 = 1, X3 = 2 ; X1 = X3, X3 = 1, X2 = 2 ; X1 = 1, X2 = X3, X3 = 2 ; X1 = 2, X2 = X3, X3 = 1 ; X1 = X3, X3 = 2, X2 = 1 ; X1 = X2, X2 = 2, X3 = 1 ; X1 = X2, X2 = X3, X3 = 2. |
如果您已经将约束添加到变量中,例如
1 2 3 4 5 | ?- X1 #< X3, all_between_enumerate(1,2,[X1,X2,X3]). X1 = X2, X2 = 1, X3 = 2 ; X1 = 1, X3 = X2, X2 = 2. |
您可以使用库CLPFD:
1 2 3 4 | :- use_module(library(clpfd)). constraint_list([]). constraint_list([H|T]):-H in 1..6 ,label([H]),constraint_list(T). |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | ?- constraint_list([X1,X2]). X1 = X2, X2 = 2 ; X1 = 2, X2 = 3 ; X1 = 2, X2 = 4 ; X1 = 2, X2 = 5 ; X1 = 3, X2 = 2 ; X1 = X2, X2 = 3 ; X1 = 3, X2 = 4 ; X1 = 3, X2 = 5 ; X1 = 4, X2 = 2 ; X1 = 4, X2 = 3 ; X1 = X2, X2 = 4 ; X1 = 4, X2 = 5 ; X1 = 5, X2 = 2 ; X1 = 5, X2 = 3 ; X1 = 5, X2 = 4 ; X1 = X2, X2 = 5. ?- L=[1,2,3] ,constraint_list(L). false. ?- L=[2,2,3] ,constraint_list(L). L = [2, 2, 3]. ?- constraint_list(L). L = [] ; L = [2] ; L = [2, 2] ; L = [2, 2, 2] ; L = [2, 2, 2, 2] ; L = [2, 2, 2, 2, 2] ; L = [2, 2, 2, 2, 2, 2] ; L = [2, 2, 2, 2, 2, 2, 2] ; L = [2, 2, 2, 2, 2, 2, 2, 2] ; L = [2, 2, 2, 2, 2, 2, 2, 2, 2] ; L = [2, 2, 2, 2, 2, 2, 2, 2, 2|...] ; L = [2, 2, 2, 2, 2, 2, 2, 2, 2|...] ; L = [2, 2, 2, 2, 2, 2, 2, 2, 2|...] ; L = [2, 2, 2, 2, 2, 2, 2, 2, 2|...] ; L = [2, 2, 2, 2, 2, 2, 2, 2, 2|...] . ... (and goes on) |