RosettaCodeData/Task/Elementary-cellular-automaton/Prolog/elementary-cellular-automaton.pro
2023-07-01 13:44:08 -04:00

31 lines
713 B
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]).
do_auto(0, _) :- !.
do_auto(N, I) :-
maplist(writ, I), nl,
apply_rules(I, Next),
succ(N1, N),
do_auto(N1, Next).
r(0,0,0,0).
r(0,0,1,1).
r(0,1,0,0).
r(0,1,1,1).
r(1,0,0,1).
r(1,0,1,0).
r(1,1,0,1).
r(1,1,1,0).
apply_rules(In, Out) :-
apply1st(In, First),
Out = [First|_],
apply(In, First, First, Out).
apply1st([A,B|T], A1) :- last([A,B|T], Last), r(Last,A,B,A1).
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).