117 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|  | %% | ||
|  | %% 000401 Slim Abdennadher and Henning Christiansen  | ||
|  | %% | ||
|  | %% ported to hProlog by Tom Schrijvers | ||
|  | 
 | ||
|  | :- module(family,[]). | ||
|  | 
 | ||
|  | :- use_module(library(chr)). | ||
|  | 
 | ||
|  | :- constraints | ||
|  |   % extensional predicates: | ||
|  |      person/2, father/2, mother/2, | ||
|  |      orphan/1,  | ||
|  |   % intensional predicates: | ||
|  |      parent/2, sibling/2, | ||
|  |   % predefined: | ||
|  |      diff/2, | ||
|  |   % a little helper: | ||
|  |      start/0. | ||
|  | 
 | ||
|  | % Representing the test for failed state, i.e., | ||
|  | % that the 'predefined' are satisfiable | ||
|  | 
 | ||
|  | diff(X,X) ==> false. | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | % Definition rules: | ||
|  | 
 | ||
|  | parent_def @ | ||
|  | parent(P,C) <=> (true | (father(P,C) ; mother(P,C))). | ||
|  | 
 | ||
|  | sibling_def @ | ||
|  | sibling(C1,C2) <=> | ||
|  |          diff(C1,C2), | ||
|  |          parent(P,C1), parent(P,C2). | ||
|  | 
 | ||
|  | ext_intro @ | ||
|  | start <=> father(john,mary),   father(john,peter), | ||
|  |           mother(jane,mary), | ||
|  |           person(john,male),   person(peter,male), | ||
|  |           person(jane,female), person(mary,female), | ||
|  |           person(paul,male). | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | % Closing rules | ||
|  | father_close @ | ||
|  | father(X,Y) ==> ( true | ((X=john, Y=mary) ; (X=john, Y=peter))). | ||
|  | 
 | ||
|  | % mother close @ | ||
|  | mother(X,Y) ==> X=jane, Y=mary. | ||
|  | 
 | ||
|  | % person_close @ | ||
|  | person(X,Y) ==> ( true | ( (X=john, Y=male)   ;  | ||
|  |                            (X=peter, Y=male)  ; | ||
|  |                            (X=jane, Y=female) ;  | ||
|  |                            (X=mary, Y=female) ; | ||
|  |                            (X=paul, Y=male) | ||
|  |                          ) | ||
|  |                 ). | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | % ICs | ||
|  | 
 | ||
|  | ic_father_unique @ | ||
|  | father(F1,C),father(F2,C) ==> F1=F2. | ||
|  | 
 | ||
|  | 
 | ||
|  | ic_mother_unique @ | ||
|  | mother(M1,C),mother(M2,C) ==> M1=M2. | ||
|  | 
 | ||
|  | ic_gender_unique @ | ||
|  | person(P,G1), person(P,G2) ==> G1=G2. | ||
|  | 
 | ||
|  | ic_father_persons @ | ||
|  | father(F,C) ==> person(F,male), person(C,S). | ||
|  | 
 | ||
|  | ic_mother_persons @ | ||
|  | mother(M,C) ==> person(M,female), person(C,G). | ||
|  | 
 | ||
|  | % Indirect def. | ||
|  | 
 | ||
|  | orphan1 @ | ||
|  | orphan(C) ==>  person(C,G). | ||
|  | 
 | ||
|  | orphan2 @ | ||
|  | orphan(C), /* person(F,male),*/ father(F,C) ==> false. | ||
|  | 
 | ||
|  | orphan3 @ | ||
|  | orphan(C), /* person(M,female),*/ mother(M,C) ==> false. | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | %%%% The following just to simplify output; | ||
|  | 
 | ||
|  | 
 | ||
|  | father(F,C) \ father(F,C)<=> true. | ||
|  | mother(M,C) \ mother(M,C)<=> true. | ||
|  | person(M,C) \ person(M,C)<=> true. | ||
|  | orphan(C) \ orphan(C)<=> true. | ||
|  | 
 | ||
|  | 
 | ||
|  | /************************************************* | ||
|  | Sample goals | ||
|  |    | ||
|  |   :- start, sibling(peter,mary). | ||
|  | 
 | ||
|  |   :- start, sibling(paul,mary).  | ||
|  | 
 | ||
|  |   :- father(X,Y), mother(X,Y). | ||
|  | 
 | ||
|  | **************************************************/ | ||
|  |                   |