142 lines
2.9 KiB
Perl
142 lines
2.9 KiB
Perl
|
% Feature Tree Constraints (CFT) ---------------------------------------------
|
||
|
% following Records for Logic Programming (Smolka,Treinen) JLP 1994:18:229-258
|
||
|
% 950512 Thom Fruehwirth ECRC, based on osf.pl, see also kl-one.pl, type.pl
|
||
|
% 980211, 980311 Thom Fruehwirth LMU for Sicstus CHR
|
||
|
|
||
|
:- use_module( library(chr)).
|
||
|
|
||
|
handler cft.
|
||
|
|
||
|
operator(100,xfx,'::'). % Variable::Sort/Expression sort constraint
|
||
|
operator(100,xfx,'@@'). % Variable@@LabelList arity/label constraint
|
||
|
operator(450,xfy,'##'). % Variable##Feature##Value feature constraint
|
||
|
% in X@@A assumes that A is a sorted list of ground features
|
||
|
% in X##F##Y assumes that feature F is a ground term and Y stays a variable or is atomic
|
||
|
|
||
|
constraints (::)/2, (@@)/2, (##)/2.
|
||
|
|
||
|
% CFT Term Dissolution
|
||
|
X::T <=> nonvar(T), \+ atomic(T) | dissolve(X,T).
|
||
|
|
||
|
dissolve(X,T):-
|
||
|
T=..[S|Ls], X::S, dissolve1(X,Ls,A), sort(A,As), X@@As.
|
||
|
dissolve1(X,[],[]).
|
||
|
dissolve1(X,[L1::T1|Ls],[L1|Ls1]):-
|
||
|
X##L1##TV,
|
||
|
(nonvar(T1) -> dissolve(TV,T1) ; TV=T1),
|
||
|
dissolve1(X,Ls,Ls1).
|
||
|
|
||
|
%!!! sort arity list, load member/2
|
||
|
|
||
|
% CFT Axiom scheme
|
||
|
% see section 3, p.235, p.236
|
||
|
% see proof of proposition 6.5, p.245
|
||
|
|
||
|
% (S) sort are pairwise disjoint
|
||
|
X::S1 \ X::S2 <=> S1=S2.
|
||
|
|
||
|
% (F) features are functional
|
||
|
X##L##Y \ X##L##Z <=> Y=Z.
|
||
|
|
||
|
% (A2) arities are unique
|
||
|
% sorting removes duplicate features
|
||
|
X@@A1 \ X@@A2 <=> A1=A2.
|
||
|
|
||
|
% (A1) If X has arity A, exactly the features in A are defined on X
|
||
|
X@@A, X##F##Y ==> member(F,A).
|
||
|
|
||
|
member(X,[Y|L]):- X=Y ; member(X,L).
|
||
|
|
||
|
% (D) determinant
|
||
|
% not implemented yet
|
||
|
|
||
|
|
||
|
% EXAMPLES ---------------------------------------------------------------
|
||
|
|
||
|
% page 236, determinant
|
||
|
eg0([U,V,W]-[X,Y,Z]):-
|
||
|
X::a(f::V,g::Y),
|
||
|
Y::b(f::X,g::Z,h::u),
|
||
|
Z::a(f::W,g::Y,h::Z).
|
||
|
|
||
|
% cyclic structure, adapted from page 1, DEC-PRL RR 32
|
||
|
eg1(P):-
|
||
|
P::person(name::id(first::_,
|
||
|
last::S),
|
||
|
age::30,
|
||
|
spouse::person(name::id(last::S),
|
||
|
spouse::P)).
|
||
|
|
||
|
% cyclic list, adapted from p. 3, DEC-PRL RR 32
|
||
|
eg2(X):-
|
||
|
X::cons(head::1,tail::X).
|
||
|
eg2a(X):- % same result as eg2(X)
|
||
|
X::cons(head::1,tail::X), X::cons(head::1,tail::cons(head::1,tail::X)).
|
||
|
|
||
|
% adapted from p.17, DEC-PRL RR 32
|
||
|
eg3(X):-
|
||
|
X::s1(l1::s),X::s2(l2::s).
|
||
|
|
||
|
/*
|
||
|
|
||
|
| ?- eg0(X); eg1(X) ; eg2(X) ; eg2a(X) ; eg3(X).
|
||
|
|
||
|
X = [_A,_B,_C]-[_D,_E,_F],
|
||
|
_D::a,
|
||
|
_D##f##_B,
|
||
|
_D##g##_E,
|
||
|
_D@@[f,g],
|
||
|
_E::b,
|
||
|
_E##f##_D,
|
||
|
_E##g##_F,
|
||
|
_E##h##_G,
|
||
|
_G::u,
|
||
|
_G@@[],
|
||
|
_E@@[f,g,h],
|
||
|
_F::a,
|
||
|
_F##f##_C,
|
||
|
_F##g##_E,
|
||
|
_F##h##_F,
|
||
|
_F@@[f,g,h] ? ;
|
||
|
|
||
|
X::person,
|
||
|
X##name##_A,
|
||
|
_A::id,
|
||
|
_A##first##_B,
|
||
|
_A##last##_C,
|
||
|
_A@@[first,last],
|
||
|
X##age##_D,
|
||
|
_D::30,
|
||
|
_D@@[],
|
||
|
X##spouse##_E,
|
||
|
_E::person,
|
||
|
_E##name##_F,
|
||
|
_F::id,
|
||
|
_F##last##_C,
|
||
|
_F@@[last],
|
||
|
_E##spouse##X,
|
||
|
_E@@[name,spouse],
|
||
|
X@@[age,name,spouse] ? ;
|
||
|
|
||
|
X::cons,
|
||
|
X##head##_A,
|
||
|
_A::1,
|
||
|
_A@@[],
|
||
|
X##tail##X,
|
||
|
X@@[head,tail] ? ;
|
||
|
|
||
|
X::cons,
|
||
|
X##head##_A,
|
||
|
_A::1,
|
||
|
_A@@[],
|
||
|
X##tail##X,
|
||
|
X@@[head,tail] ? ;
|
||
|
|
||
|
*/
|
||
|
|
||
|
% end of handler cft ----------------------------------------------------------
|
||
|
|
||
|
|
||
|
|
||
|
|