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 ----------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |