小编max*_*xdh的帖子

CLP(FD)的相互排他性

我正在编写一个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)

prolog clpfd

7
推荐指数
1
解决办法
87
查看次数

标签 统计

clpfd ×1

prolog ×1