1.f[^`

f[^`́Â悤ɂȂĂ܂B

[vf,̗vf̐,vf,̗vf̐,vf,̗vf̐,...]

Avf́AɃ\[gĂ܂B

Ⴆ΁A[7,1,2,7,7]ƂXg̏ꍇA73A11A22̂ŁA
Ƀ\[gāA[1,1,2,1,7,3]Ƃ`ƂȂ܂B

2.encode/2

encode/2ł́ANCbN\[g̃ASYpāA͂ꂽXg
\[gƓɁAꂼ̗vf̐JEgĂ܂B

 encode([]   ,Out) :- Out = [].
 encode([H|T],Out) :- terminal(T,H,1,Out,[]).

terminal/5ƂqŁANCbN\[g̎vfIĂ܂A
ɂ́A݂čŏɓꂽ2̈قȂl̑傫قƂƂ
@pĂ܂(3,4Ԗڂ̐)BŁAقȂl܂ŃXg
T[`̂ƕsāAvf̐JEgĂ܂(2Ԗڂ̐)B
قȂvf΁A̗vfƁAvf̐ʂƂďo͂܂(1Ԗ
̐)B

 terminal([]   ,H0,N,Xs ,Ys) :- Xs=[H0,N|Ys].
 terminal([H|T],H0,N,Xs, Ys) :- H =:= H0 |
     terminal(T,H0,~(N+1),Xs,Ys).
 terminal([H|T],H0,N,Xs0,Ys) :- H  >  H0 |
     node(T,H ,L,R), terminal(L,H0,N,Xs0,Xs1), terminal(R,H,1,Xs1,Ys).
 terminal([H|T],H0,N,Xs0,Ys) :- H  <  H0 |
     node(T,H0,L,R), terminal(L,H,1,Xs0,Xs1), terminal(R,H0,N,Xs1,Ys).

̌Anode/4pāAvf̗vf̏WƁAvfȏ̗vf̏W
Ƃɕ܂B̎ȂIѕAꂼ̏WƂȂ邱
߁Ȁꍇ̔sKv܂B

 node([]   ,V,L,R) :-          L = [], R = [].
 node([H|T],V,L,R) :- H >= V | R = [H|NR], node(T,V,L,NR).
 node([H|T],V,L,R) :- H <  V | L = [H|NL], node(T,V,NL,R).

3.decode/2

decode/2́AevfA̗vf̐邱ƂōsĂ܂B
ōsƂlāAdecode/4Ƃ1̏qőSĂ̏sĂ܂B

 decode([]     ,L) :- L = [].
 decode([H,N|T],L) :- decode(N,H,T,L).

 decode(N,H,T      ,L) :- N > 0 | L = [H|L1], decode(~(N-1),H,T,L1).
 decode(0,_,[]     ,L) :- L = [].
 decode(0,_,[H,N|T],L) :- decode(N,H,T,L).

4.union/3

union/3́A}[W邱ƂŎĂ܂BЕ̃Xgɂ
vf́Â܂܌ʂɗ܂(1`4Ԗڂ̐)B܂Avfꂽ
ꍇA̗vfČʂƂ܂(5Ԗڂ̐)B܂AK[ȟ`
𓯂ɂ邱ƂŁAKLICCւ̃RpC悭Ȃ悤ɂ
Ă܂B

 union([],M1,M) :- M1 = M.
 union(M0,[],M) :- M0 = M.
 union(M0,M1,M) :- M0 = [H0,_ |_ ], M1 = [H1,N1|T1], H0  >  H1 |
     M = [H1,N1	    |MN], union(M0,T1,MN).
 union(M0,M1,M) :- M0 = [H0,N0|T0], M1 = [H1,_ |_ ], H0  <  H1 |
     M = [H0,N0	    |MN], union(T0,M1,MN).
 union(M0,M1,M) :- M0 = [H0,N0|T0], M1 = [H1,N1|T1], H0 =:= H1 |
     M = [H0,~(N0+N1)|MN], union(T0,T1,MN).

5.intersection/3

intersection/3ł́A2̃XgɌĂāAЕ̃Xgɂ
Ȃvf͖(1`4Ԗڂ̐)A2̃XgɓvfꍇɁA
̗vfƁAvf̏Ԃ(5,6Ԗڂ̐)ƂōsĂ܂B
union/3ƓlɁAK[ȟ`𓯂ɂČグĂ܂B

 intersection([],_ ,M) :- M = [].
 intersection(_ ,[],M) :- M = [].
 intersection(M0,M1,M) :- M0=[H0,_ |_ ], M1=[H1,_ |T1], H0  >  H1 |
		     intersection(M0,T1,M ).
 intersection(M0,M1,M) :- M0=[H0,_ |T0], M1=[H1,_ |_ ], H0  <  H1 |
		     intersection(T0,M1,M ).
 intersection(M0,M1,M) :- M0=[H0,N0|T0], M1=[H1,N1|T1], H0 =:= H1, N0 >= N1 |
     M = [H0,N1|MN], intersection(T0,T1,MN).
 intersection(M0,M1,M) :- M0=[H0,N0|T0], M1=[H1,N1|T1], H0 =:= H1, N0 =< N1 |
     M = [H0,N0|MN], intersection(T0,T1,MN).

6.difference/3

difference/3́Aintersection/3Ɠlɍs܂B1ڂ̃Xgɂ̂݌
vf͂̂܂ܕԂ(2,4Ԗڂ̐)A2ڂ̃Xgɂ̂݌vf͖
܂(1,3Ԗڂ̐)B܂AvfꍇA̍߂āAv
f1ȏcȂ΁AʂƂĕԂ܂(5,6Ԗڂ̐)Bł
union/3ƓlAK[ȟ`𓯂ɂČグĂ܂B

 difference([],_ ,M) :- M = [].
 difference(M0,[],M) :- M = M0.
 difference(M0,M1,M) :- M0=[H0,_ |_ ], M1=[H1,_ |T1], H0  >  H1 |
			   difference(M0,T1,M ).
 difference(M0,M1,M) :- M0=[H0,N0|T0], M1=[H1,_ |_ ], H0  <  H1 |
     M = [H0,N0      |MN], difference(T0,M1,MN).
 difference(M0,M1,M) :- M0=[H0,N0|T0], M1=[H1,N1|T1], H0 =:= H1, N0 >  N1 |
     M = [H0,~(N0-N1)|MN], difference(T0,T1,MN).
 difference(M0,M1,M) :- M0=[H0,N0|T0], M1=[H1,N1|T1], H0 =:= H1, N0 =< N1 |
			   difference(T0,T1,M ).

7.contraction/2

contraction/2ł́AXg̑SẮuvfv̍ڂ1ɂ鏈s
Ă܂B

 contraction([]     ,M) :- M = [].
 contraction([H,_|T],M) :- M = [H,1|MN], contraction(T,MN).

8.choose/3

choose/3Ŏovf́Aŏ̗vfƂ܂B܂A̗vfc
̃}`WƂẮAŏ̗vf̐1炵WɂȂ܂B
Avf0̗vfĂ͂Ȃ̂ŁAŏ̗vf̐1
ꍇ́A̗vf̂𖳂܂B

 choose([H,1|T],E,S) :-         E = H, S = T.
 choose([H,N|T],E,S) :- N > 1 | E = H, S = [H,~(N-1)|T].

