Declaratieve Talen/Oplossing celautomaat: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Geen bewerkingssamenvatting
Geen bewerkingssamenvatting
Regel 1: Regel 1:
Deze oplossing werkte voor zover ik getest heb... Bij predicaat regels wordt ook overal de 'javelregel' toegevoegd.  
Deze oplossing werkte voor zover ik getest heb... Bij predicaat regels wordt ook overal de 'javelregel' toegevoegd.  
reg([[o,o,o,o],[o,x,o,o],[o,o,x,x],[x,o,o,x],[x,o,x,x]]).
   
   
  volgendegen(Seq,Regels,Volgende):-
  volgendegen(Seq,Regels,Volgende):-
Regel 23: Regel 21:
   
   
  % regels genereren voor 1 overgang van een sequentie naar zijn opvolger  
  % 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):-
  regelsseq(S1,Regels,S2):-
  regelsseq2([o,o|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,o],[ [o,o,o,V] ],[V,V]).
  regelsseq2([o,x],[[o,x,o,V1],[x,o,o,V2]],[V1,V2]).
  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,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([x,x],[[x,x,o,V1],[x,o,o,V2]],[V1,V2]).
 
  regelsseq2([S1,S2,S3|Seq],Regels,[V1|Volgende]):-
  regelsseq2([S1,S2,S3|Seq],Regels,[V1|Volgende]):-
  regelsseq2([S2,S3|Seq],Regels,Volgende),
  regelsseq2([S2,S3|Seq],Regels,Volgende),
  member([S1,S2,S3,V1],Regels).
  member([S1,S2,S3,V1],Regels).
  regelsseq2([S1,S2,S3|Seq],[[S1,S2,S3,V1]|Regels],[V1|Volgende]):-
  regelsseq2([S1,S2,S3|Seq],[[S1,S2,S3,V1]|Regels],[V1|Volgende]):-
  regelsseq2([S2,S3|Seq],Regels,Volgende),
  regelsseq2([S2,S3|Seq],Regels,Volgende),
Regel 46: Regel 45:
  remove_doubles(List,L2),
  remove_doubles(List,L2),
  \+member(L,L2).
  \+member(L,L2).
 
% testen of een lijst van regels geen tegenstrijdige regels bevat
  geldig([_]).
  geldig([_]).
  geldig([[X,Y,Z,_]|List]):-
  geldig([[X,Y,Z,_]|List]):-
  geldig(List),
  geldig(List),
  \+member([X,Y,Z,_],List).
  \+member([X,Y,Z,_],List).

Versie van 11 jun 2007 11:25

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).