Declaratieve Talen/Oplossing celautomaat
Deze oplossing werkte voor zover ik getest heb... Bij predicaat regels wordt ook overal de 'javelregel' toegevoegd.
volgendegen(Seq,Regels,Volgende):- volgendegen2([o,o|Seq],Regels,Volgende). volgendegen2([S1,S2],Regels,[V1,V2]):- member([S1,S2,o,V1],Regels), member([S2,o,o,V2],Regels). volgendegen2([S1,S2,S3|Seq],Regels,[V1|Volgende]):- member([S1,S2,S3,V1],Regels), volgendegen2([S2,S3|Seq],Regels,Volgende). 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). % regels genereren voor 1 overgang van een sequentie naar zijn opvolger % bij eerste in sequentie 2 o's toevoegen voor het genereren begint regelsseq(S1,Regels,S2):- regelsseq2([o,o|S1],Regels,S2). % op het einde van de sequentie 2 extra o's veronderstellen 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). % dubbels verwijderen uit een lijst van 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). % testen of een lijst van regels geen tegenstrijdige regels bevat geldig([_]). geldig([[X,Y,Z,_]|List]):- geldig(List), \+member([X,Y,Z,_],List).