Declaratieve Talen/Oplossing celautomaat

Uit Wina Examenwiki
Versie door 10.91.23.51 (overleg) op 11 jun 2007 om 10:11
Naar navigatie springen Naar zoeken springen
regels([S1,S2],Regels):-

regelsseq(S1,Regels,S2).

regels([S1,S2|Sequenties],Regels):-

regels([S2|Sequenties],R1), regelsseq(S1,R2,S2), merge(R1,R2,R3), remove_doubles(R3,Regels), geldig(Regels).

regelsseq(S1,Regels,S2):-

regelsseq2([o,o|S1],Regels,S2).

regelsseq2([o,o],o,o,o,V,[V,V]).
regelsseq2([o,x],[[o,x,o,V1],[x,o,o,V2]],[V1,V2]).
regelsseq2([x,o],[[x,o,o,V1],[o,o,o,V2]],[V1,V2]).
regelsseq2([x,x],[[x,x,o,V1],[x,o,o,V2]],[V1,V2]).
regelsseq2([S1,S2,S3|Seq],Regels,[V1|Volgende]):-

regelsseq2([S2,S3|Seq],Regels,Volgende), member([S1,S2,S3,V1],Regels).

regelsseq2([S1,S2,S3|Seq],[[S1,S2,S3,V1]|Regels],[V1|Volgende]):-

regelsseq2([S2,S3|Seq],Regels,Volgende), \+member([S1,S2,S3,_],Regels).

remove_doubles([L],[L]).
remove_doubles([L|List],L2):-

remove_doubles(List,L2), member(L,L2).

remove_doubles([L|List],[L|L2]):-

remove_doubles(List,L2), \+member(L,L2).

geldig([_]).
geldig([[X,Y,Z,_]|List]):-

geldig(List), \+member([X,Y,Z,_],List).