使用约束在ECLiPSe Prolog中修剪对称解决方案

时间:2019-06-05 20:46:26

标签: prolog eclipse-clp constraint-satisfaction

这是我当前正在处理的约束满足问题的子问题,因此,我省略了适用于变量的额外约束。

假设我们有5个变量的列表,并且说vars可以取值1到3。对称性定义如下:假设我们要对所有变量进行2个完全赋值。我们还假设对于这些完整分配中的每一个,我们都计算具有相同值的变量集。如果我们找到一种方法,使第一个分配的每个集合在第二个分配中具有相同/相同的集合,则两个所述分配将是对称的。

这是一个使情况更清楚的小例子: 让我们进行以下两个任务:

L1 = [ 1, 2, 1, 1, 3 ]
L2 = [ 2, 1, 2, 2, 3 ]

这两个是对称的。 让我们还采用以下内容:

L3 = [3, 1, 3, 3, 2]

这也与L1和L2对称。

我正在尝试修剪所有对称任务。如何在约束中表达这一点?

到目前为止,我已经尝试使用约束条件来查找没有赋值的第一个变量,并且基本上使用#= / 2锁定其值;每个可能的域值都会发生一次。我的代码遇到实例化错误,但是我不确定我的努力实际上是否是解决此问题的有效方法。

:-lib(ic).

getNth(0, [ H | T], H, T).
getNth(Count, [ _ | T], Target, Others):-
    NewCount is Count - 1,
    getNth(NewCount, T, Target, Others).

assigned(_, [], TruthVal, TruthVal).
assigned(Var, [Val | OtherVals], CurTruthVal, TruthVal):-
    UpdatedTruthVal #= (CurTruthVal and (Var #\= Val)),
    assigned(Var, OtherVals, UpdatedTruthVal, TruthVal).

firstUnassigned(_, [], _, _, _, _).
firstUnassigned( CurP, [Var | OtherVars], PrevVals, Found, CurCount, Index):-
    assigned(Var, PrevVals, 1, TruthVal),
    (TruthVal and (Found #\= 1)) => ((Index #= CurCount) and (Var #= CurP) and (NewFound #= 1)),
    Found => (NewFound #= Found),
    NewCount is CurCount + 1,
    firstUnassigned(CurP, OtherVars, PrevVals, NewFound, NewCount, Index).

symmetryConstraints(CurP, NP, _, _):-
    CurP > NP.

symmetryConstraints(CurP, NP, L, PrevVals):-
    CurP =< NP,
    firstUnassigned(CurP, L, PrevVals, 0, 0, Index),
    getNth(Index, L, _, NextL),
    NewP is CurP + 1,
    symmetryConstraints(NewP, NP, NextL, [CurP | PrevVals]).

start(L):-
    L = [ Var1, Var2, Var3 ],
    L #:: 1..2,
    length(L, N),
    symmetryConstraints(1, N, L, []),
    search(L, 0, most_constrained, indomain, complete, []).

0 个答案:

没有答案