作者:手机用户2502937345 | 来源:互联网 | 2023-01-07 21:45
我正在编写一个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).
编辑:
运行:
[A,B] ins 2..6, A #
得到:
A = 2,
B = 3,
M = 1 ;
A = 2,
B = 4,
M = 0 ;
A = 2,
B = 5,
M in 0..1 ;
A = 3,
B = 5,
M = 1 ;
A = 4,
B = 5,
M = 0 ;
但我不希望A=2, B=5, M in 0..1
是一个有效的输出,既不A
也不B
是3或4.