/*   Uso il successore;   per semplificare la notazione: */

:- op(100, fy, s).

/*  Astrazione:   considero la scala come una porta particolare, che mette in
    comunicazione stanze di piani diversi; posso quindi usare:
    comunica(A,B):   A è in comunicazione con B attraverso una porta aperta
    o la scala
    Le LEGGI GENERALI SONO:                                                  */
    
da(A,B,s 0) :- comunica(A,B).
da(A,B,s I) :- comunica(A,C), da(C,B,I).

comunica(A,B) :- (porta(P,A,B); porta(P,B,A)),
                 aperta(P).
                 
aperta(P):- not(chiusa(P)).

/*  DOVE:
    porta(P,S1,S2):  c'e' una porta P con battente da S1 a S2;
                     la scala è visto come porta
    aperta(P):  P e' aperta;
    chiusa(P):  P è chiusa;
    NB: not non è DCL, ma così il programma è più stabile   */




/***********  CODIFICA DELL'APPARTAMENTO IN FIG.1 *****
              FATTI NON CONTINGENTI
              Osservo che nel caso specifico un piano è
              la copia dell'altro; codifico le stanze con
              termini st(S,I) (stanza S al piano I) e le
              porte diverse dalla scala con pt(P,I)
              (porta P del piano I); in questo modo posso
              "copiare" un piano dall'altro           */

/*    PIANO 1  */

porta(pt(p1,1),st(a,1),st(c,1)).
porta(pt(p2,1),st(b,1),st(c,1)).
porta(pt(p3,1),st(c,1),st(d,1)).
porta(scala, st(d,1),st(d,2)).


/** ricopio la struttura del primo piano */

porta(pt(P,2),st(S1,2),st(S2,2)) :- porta(pt(P,1),st(S1,1),st(S2,1)).



/****************  CODIFICA DI FIG.1: FATTI CONTINGENTI **/

chiusa(pt(p2,1)).
chiusa(pt(p1,2)).


/*******   PARTE DI DETERMINAZIONE DELL'ESISTENZA SOLUZIONE
           USANDO min                                     */

soluzione(K,A,B) :- min(K,da(A,B,K)).


/**** Siccome vi sono 8 stanze, basta fino a 8       */

tenta(0).
tenta(s 0).
tenta(s s 0).
tenta(s s s 0).
tenta(s s s s 0).
tenta(s s s s s 0).
tenta(s s s s s s 0).
tenta(s s s s s s s 0).
tenta(s s s s s s s s 0).

min(K,X) :- tenta(K), X, !.




           






