【发布时间】:2017-11-21 13:16:27
【问题描述】:
我正在使用 clp(fd) 编写一个 Prolog 程序,并且很难实现我想要的约束之一。
输出是一个整数列表(长度取决于程序另一部分的输入),其中有某些预定义的数字对是互斥的,每对中的一个数字必须 在输出中。
一个例子:
输出是一个整数列表,每个整数都在 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 #< B, mutual2([1,2,B,A,5],M), label([A,B]).
给予:
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。
【问题讨论】:
-
您是否还打算将序列限制为正好 5 个整数?
-
不,输出的长度是基于可变输入的。
-
ExprA #<==> #\ ExprB呢? -
首先声明
A in 3..4等 -
是的,这特别是关于互斥性并确保一对中的一个值存在。输入类似于:[A,B] ins 2..6,mutual2([1,2,A,B,5],M), label([A,B])。