1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
% ordre lexicographique
%leq([0],[1]).
leq([0|_],[1|_]).
leq([X|C1],[X|C2]):-
leq(C1,C2).
% xor
xor(0,0,0).
xor(1,0,1).
xor(0,1,1).
xor(1,1,0).
xorListe([X1],[X2],[X]):-
xor(X1,X2,X).
xorListe([X1|L1],[X2|L2],[X|L]):-
xor(X1,X2,X),
xorListe(L1,L2,L).
%xorListe(L1,L2,L).
xorListeListe([X1,X2],L):-
xorListe(X1,X2,L).
xorListeListe([X1|X],L):-
xorListeListe(X,LL),
xorListe(X1,LL,L).
% on calcule sigma(u,v) en faisant le produit scalaire entre u1,...,uN,uN+1,..U2N et vN+1,...,v2N,v1,...,vN
% on coupe L en un morceau de taille N et un autre
%split(L,0,[],L).
%split([X|Xs],N,[X|Ys],Zs) :- N1 is N - 1, split(Xs,N1,Ys,Zs).
split(L,N,L1,L2):-
length(L1,N),
append(L1,L2,L).
% produit scalaire
ps([X1],[Y1],Res):-
Res is X1*Y1.
ps([X1|L1],[X2|L2],Res):-
ps(L1,L2,Res2),!,
Res is xor(X1*X2, Res2).
% produit symplectique
sigma(O1,O2,N,Res):-
split(O2,N,Moitie1,Moitie2),
append(Moitie2,Moitie1,NewO2),
ps(O1,NewO2,Res).
init(N, L) :-
NN is 2*N,
length(L,NN),
forall(member(X,L), member(X,[0,1])).
contraintes(O1,O2,O3,O4,O5,C, N):-
/*
NN is 2*N,
length(O1,NN),
length(O2,NN),
length(O3,NN),
length(O4,NN),
length(O5,NN),
length(C,NN),
O1 ins {0,1},
O2 ins {0,1},
O3 ins {0,1},
O4 ins {0,1},
O5 ins {0,1},
C ins {0,1},
*/
maplist(init(N), [O1,O2,O3,O4,O5,C]),
xorListeListe([O1,O2,O3,O4],O5),
xorListe(C,O1,D1),
xorListe(C,O2,D2),
xorListe(C,O3,D3),
xorListe(D3,O5,D4),
xorListe(D3,O4,D5),
xorListe(D2,O4,D6),
xorListe(D2,O5,D7),
xorListe(D1,O4,D8),
xorListe(D1,O5,D9),
leq(O1, C),
leq(O1, O2),
leq(O2, O3),
leq(O3, O4),
leq(O4, O5),
leq(O1,D1),
leq(O2,D2),
leq(O2,D3),
leq(O1,D4),
leq(O1,D5),
leq(O1,D6),
leq(O1,D7),
leq(O2,D8),
leq(O2,D9),
sigma(O1,O2,N,1),
sigma(O1,O3,N,1),
sigma(O1,O4,N,1),
sigma(O1,O5,N,1),
sigma(O2,O3,N,1),
sigma(O2,O4,N,1),
sigma(O2,O5,N,1),
sigma(O3,O4,N,1),
sigma(O3,O5,N,1),
sigma(O4,O5,N,1),
sigma(O4,C,N,1),
sigma(O1,C,N,0),
sigma(O2,C,N,0),
sigma(O3,C,N,0). |
Partager