/*
f(nil) = nil.
f(cons(X,L))=cons(s(X),f(L)).

g(X)=f(f(X)).



precedence([f,g,s,cons,nil]).
*/
/*
append(nil,L) = L.
append(cons(X,L),L1) = cons(X,append(L,L1)).

rev(nil)=nil.
rev(cons(X,L))=append(rev(L),cons(X,nil)).

X=rev(rev(X)).

precedence([rev,id,append,cons,nil]).

*/

match(P, S) = loop(P, S, P, S).

loop(nil,S, OP, OS) = true.
loop(cons(P,PS), nil, OP, OS) = false.
eq(P,S) -> loop(cons(P,PS),cons(S,SS),OP,OS) = loop(PS,SS,OP,OS).
neq(P,S) -> loop(cons(P,PS),cons(S,SS),OP,OS) = next(OP, OS).

next(OP, nil) = false.
next(OP,cons(S,OS)) = loop(OP,OS,OP,OS).

f(SS)=match(cons(a,cons(a,cons(b,nil))),SS).

true=false -> [].

eq(a,a).
eq(b,b).
neq(a,b).
neq(b,a).


precedence([match,cons,loop,next,f,eq,neq,nil,a,b]).
