Programmazione Logica -- Lezione 11: Metainterprete per gerarchie isa

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


Esempio di sessione:

Il Programma e' stato salvato in un file "Prog4.pl"

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