:- ensure_loaded(typeops). % An example of type annotated Prolog: % module posat % % satisfy constraints over a poset % :- type_import(poset). % import abstract type poset(T) %---- % three kinds of constraints are handled % type po_constraint(T) --> T = T; T =< T; lub(T,list(T)). % least upper bound %---- % satisfy_constraints(PO,C) :- % constraints C are satified in poset PO, % C may contain logical variables when called. % PO must be a quasi-lattice. % pred satisfy_constraints(poset(@T),list(po_constraint(T))). % satisfy_constraints(_PO, []) :- !. satisfy_constraints(PO, [X=Y|C]) :- !, X = Y, satisfy_constraints(PO,C). satisfy_constraints(PO, [X=<Y|C]) :- !, po_leq(PO, X,Y), satisfy_constraints(PO,C). satisfy_constraints(PO, [lub(Y,S)|C]) :- !, check(\+ S=[]), lubt_set(PO,S,Y), satisfy_constraints(PO,C).