/* MetaInterprete per Teorie organizzate secondo una gerarchia isa
solve(G,T) risolve il goal G rispetto alla teoria T */
solve(true,_).
solve((G1,G2),T) :- solve(G1,T), solve(G2,T).
solve(solve(A,T),_) :- solve(A,T).
solve(A,T) :- isa_closure(T,T1), clause_in_th(A,B,T1), solve(B,T).
/* isa_closure e' la chiusura simmetrica e transitiva di isa */
isa_closure(T,T).
isa_closure(T1,T2) :- isa(T1,T), isa_closure(T,T2).
/* clause_in_th(A,B,T) verifica che la clausola A:-B appartenga alla teoria T.
Tale appartenenza si suppone che sara' rappresentata inserendo l'atomo
theory(T) come atomo piu' a sinistra nella clausola, cioe' scrivendo
la clausola come A :- (theory(T), B). */
clause_in_th(A,B,T) :- clause(A, (theory(T),B)).
/* Esempio di teorie organizzate secondo una gererchia isa */
isa(mammal,animal).
isa(bird,animal).
isa(human,mammal).
isa(dog,mammal).
isa(john,human).
isa(sally,human).
isa(fido,dog).
male :- (theory(fido), true).
male :- (theory(john), true).
female :- (theory(sally), true).
lactate :- (theory(mammal), female).
lay_eggs :- (theory(bird), female).
owner(sally) :- (theory(fido), true).
work_in(new_york) :- (theory(john), true).
work_in(philadelphia) :- (theory(sally), true).
live_in(X) :- (theory(human), work_in(X)).
live_in(X) :- (theory(dog), (owner(Y), solve(live_in(X), Y))).
[cygnus:catuscia:~/Prolog:50] pl
Welcome to SWI-Prolog (Version 2.7.15)
Copyright (c) 1993-1996 University of Amsterdam. All rights reserved.
For help, use ?- help(Topic). or ?- apropos(Word).
1 ?- consult('Prog4').
Prog4 compiled, 0.02 sec, 3,872 bytes.
Yes
2 ?- solve(live_in(X),john).
X = new_york ;
No
3 ?- solve(live_in(X),fido).
X = philadelphia ;
No
4 ?- solve(lactate,T).
T = sally ;
No
5 ?- solve(male,T).
T = fido ;
T = john ;
No
6 ?- halt.
[cygnus:catuscia:~/Prolog:51]