% ================================================================= :- pred constr(bool). :- mode constr(in). :- ignore constr/1. % ================================================================= % Program :- pred append(list(int),list(int),list(int)). :- mode append(in,in,out). append([],Ys,Ys). append([X|Xs],Ys,[Y|Zs]) :- append(Xs,Ys,Zs). % error: Y ---> X % ============================================================ % Catamorphisms. % ------------- % listMin(List,B,Res): if B then Res is the minimum element of List :- pred listMin(list(int),bool,int). :- mode listMin(in,out,out). :- cata listMin/3-1. listMin([],B,Res) :- constr( ((~B) & Res=0) ). listMin([H|T],B,Res) :- constr( B & ( Res=ite(BT, ite(H (BZs & NZs=ite(NXs (BZs & (NZs=NXs)) )) & ((~BXs & BYs ) => (BZs & (NZs=NYs) ) )) & ((~BXs & ~BYs) = (~BZs) )) ), listMin(Xs,BXs,NXs), listMin(Ys,BYs,NYs), listMin(Zs,BZs,NZs), constr(N=ite(NXs