我正在编写一个Prolog程序clp(fd),并且很难实现我想要的约束之一.
输出是整数列表(长度取决于程序另一部分的输入),其中存在某些互斥的预定义数字对,并且每对中的一个数字必须在输出中.
一个例子:
输出是一个整数列表,每个整数在1到10之间.输出必须包含3或4,但不能同时包含两者.
到目前为止,我有以下,从而限制了它,这样3和4不能同时输出,但它不保证其中之一是在输出中.
mutual2([A], ME1):-
(A in 3 #==> ME1) #/\ (#\ A in 4 #<== ME1).
mutual2([A, B| Tail], ME1):-
(A in 3 #==> ME1) #/\ (#\ A in 4 #<== ME1),
(B in 3 #==> ME1) #/\ (#\ B in 4 #<== ME1),
mutual2([B|Tail], ME1).
Run Code Online (Sandbox Code Playgroud)
编辑:
运行:
[A,B] ins 2..6, A #< B, mutual2([1,2,B,A,5],M), label([A,B]).
Run Code Online (Sandbox Code Playgroud)
得到:
A = 2,
B = 3,
M = 1 ;
A = 2,
B …Run Code Online (Sandbox Code Playgroud)