这是我当前正在处理的约束满足问题的子问题,因此,我省略了适用于变量的额外约束。
假设我们有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, []).