macro(free(Expr), ~containment(Expr)). macro(sigma(N),set(L)):- findall(C,fsa_util:between(1,N,C),L). macro(columns(N),Ints) :- columns(1,N,Ints). %% don't use ordinary operator syntax, since this file is read-in with %% regular expression operator precedences active. columns(N,N,free([N,? *,N])). columns(N0,N,free([N0,? *,N0]) & Ints) :- N0<N, is(N1,+(N0,1)), columns(N1,N,Ints). macro(diagonals(N), I) :- diagonals(1,N,I). diagonals(N0,N,I) :- is(N,N0+1),!, diagonals_n(1,N0,N,I). diagonals(N0,N,I0 & I) :- diagonals_n(1,N0,N,I0), is(N1,+(N0,1)), diagonals(N1,N,I). diagonals_n(N0,Br,N,I0) :- is(N,+(N0,Br)),!, diagonal(N0,Br,I0). diagonals_n(N0,Br,N,I0 & I):- diagonal(N0,Br,I0), is(N1,+(N0,1)), diagonals_n(N1,Br,N,I). diagonal(N0,Br,free([N0,length(MidN),N])) :- is(N,+(N0,Br)), is(MidN,-(Br,1)).