:- use_module(library(lists), [append/3]). celauton(Evolution,Rules) :- setof(Rule, needed_rule(Evolution,Rule), Rules), consistent(Rules). needed_rule([T1,Time2|_],Rule) :- append([o,o|T1],[o,o],Time1), needed_rule(Time2,Time1,Rule). needed_rule([_|Evolution],Rule) :- needed_rule(Evolution,Rule). needed_rule([X|_],[A,B,C|_],[A,B,C,X]). needed_rule([_|Time2],[_|Time1],Rule) :- needed_rule(Time2,Time1,Rule). consistent([_]). consistent([[A1,B1,C1,_],[A2,B2,C2,_]|R]) :- [A1,B1,C1] \== [A2,B2,C2], consistent([[A2,B2,C2,_]|R]).