This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/chr/Examples/family.chr

117 lines
2.3 KiB
Plaintext
Raw Normal View History

2015-10-13 08:17:51 +01:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% 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).
**************************************************/