:- ensure_loaded(typeops).
% An example of type annotated Prolog:
%
% partially ordered sets
%
:- type_import(prolog_types).
:- type_import(lib).
%----------------------------------------------
% A partial order over some domain D has a binary relation D =< D
% where =< is reflexive, transfitive and antisymmetric.
%
type order1(T) --> T =< T.
% A partially ordered set is internally represented by a structure
abstract
type poset(T) -->
poset( list(T), % domain
list(order1(T)) % order relationships
).
%----
% po_create(Domain,Order,PO) :-
% PO is the internal repr. of partial order over Domain.
%
pred po_create(list(@T),list(order1(T)),poset(@T)).
%
po_create(Domain,Order,PO) :-
% ... implementation not part of example
%----
% po_leq(PO,X,Y) :- (X =< Y) is true in PO.
%
pred po_leq(poset(@T),T,T).
%
po_leq(_PO,X,X).
po_leq(poset(_,LT),X,Y) :- member(X=<Y,LT).
% ...