:- use_module(library(lists), [member/2]). starpalindrome(Commands) :- collect_stars(Commands,Stars), ( Stars == [] -> true ; check_palindrome(Stars) ). check_palindrome(Stars) :- setof((X,Y),symmetry_point(Stars,X,Y),SymmetryPoints), member((X,Y),SymmetryPoints), \+ some_star_has_no_symmetric_star(Stars,X,Y). some_star_has_no_symmetric_star(Stars,X,Y) :- member(star(A,B),Stars), \+ has_symmetric_star(A,B,Stars,X,Y). has_symmetric_star(A,B,Stars,X,Y) :- member(star(C,D),Stars), X is A + C, Y is B + D. symmetry_point(Stars,X,Y) :- member(star(X1,Y1),Stars), member(star(X2,Y2),Stars), X is X1 + X2, Y is Y1 + Y2.