Elementary cellular automaton: Difference between revisions

Content added Content deleted
m (updated to use generality)
Line 1,542: Line 1,542:


=={{header|Prolog}}==
=={{header|Prolog}}==
<lang prolog>play :- initial(I), play(50, I).
<lang prolog>play :- initial(I), do_auto(50, I).


initial([0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0]).
play(0, _) :- !.

play(N, I) :-
do_auto(0, _) :- !.
do_auto(N, I) :-
maplist(writ, I), nl,
maplist(writ, I), nl,
apply_rules(I, Next),
apply_rules(I, Next),
succ(N1, N),
succ(N1, N),
play(N1, Next).
do_auto(N1, Next).


r(0,0,0,0).
r(0,0,0,0).
Line 1,560: Line 1,562:
r(1,1,1,0).
r(1,1,1,0).


apply_rules([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S],
apply_rules(In, Out) :-
apply1st(In, First),
[A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1]) :-
Out = [First|_],
apply(In, First, First, Out).
r(S,A,B,A1), r(A,B,C,B1), r(B,C,D,C1), r(C,D,E,D1), r(D,E,F,E1),
r(E,F,G,F1), r(F,G,H,G1), r(G,H,I,H1), r(H,I,J,I1), r(I,J,K,J1),
r(J,K,L,K1), r(K,L,M,L1), r(L,M,N,M1), r(M,N,O,N1), r(N,O,P,O1),
r(O,P,Q,P1), r(P,Q,R,Q1), r(Q,R,S,R1), r(R,S,A,S1).
writ(0) :- write('.').
writ(1) :- write(1).


apply1st([A,B|T], A1) :- last([A,B|T], Last), r(Last,A,B,A1).
initial([0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0]).</lang>
apply([A,B], Prev, First, [Prev, This]) :- r(A,B,First,This).
apply([A,B,C|T], Prev, First, [Prev,This|Rest]) :- r(A,B,C,This), apply([B,C|T], This, First, [This|Rest]).

writ(0) :- write('.').
writ(1) :- write(1).</lang>


=={{header|Python}}==
=={{header|Python}}==