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).
|
|
|
|
**************************************************/
|
|
|