AUTOMATISMI DI RISOLUZIONE 11. Il programma PROLOG

AUTOMATISMI DI RISOLUZIONE 11. Il programma PROLOG

AUTOMATISMI DI RISOLUZIONE 11

 (Didattica delle scienze e informatica nella scuola,n.
151 e 152, 1991, Editrice la Scuola di Brescia)

                    /*BASE.PRO*/

DOMAINS

 
numero=integer

 
elemento=symbol

 
relazione,descrizione=string

 
lista_elementi=elemento*

 
lista_relazioni=relazione*

 
ff=ff(elemento,elemento,elemento,relazione)

  lf=ff*

 
fc=fc(elemento,numero,numero,relazione)

  lc=fc*

DATABASE

 
lista_elementi(lista_elementi);condizioni(lista_elementi,lista_elementi)

 
contatore(numero)

PREDICATES

 
relazione(elemento,elemento,elemento,relazione)

 
lista_elementi_incogniti(lista_elementi)

 
lista_elementi_noti(lista_elementi);lista_costanti(lista_elementi)

 

 
f(elemento,elemento,elemento,relazione)

 
t(elemento,lista_elementi,lista_elementi,lista_elementi,lf,lf)

 
g(lista_elementi,lista_elementi,lista_elementi,lf,lf)

 
scrivi(lf,numero);passo(numero,numero);lista_dati(lista_elementi)

 

 
inverti(lf,lf);inver(lf,lf,lf);insieme(lista_elementi,lista_elementi)

 
ins(lista_elementi,lista_elementi,lista_elementi)

 
concatena(lista_elementi,lista_elementi,lista_elementi)

 
fa_parte(elemento,lista_elementi);fa_parte(ff,lf);fa_parte(fc,lc)

 
scrivi_lista(lista_elementi);lettura;scelta;opzione(numero);risoluzione

 
input_fissi(lista_elementi,lista_elementi);ritorno;c;scritta_finale(numero)

 
disc1(lf,lista_elementi);disc(lf,lista_elementi,lista_elementi)

 
discussione1(lista_elementi,lista_elementi,lista_elementi)

 
discussione(lista_elementi,lista_elementi,lista_elementi,lista_elementi)

 
precisazione(lista_elementi)

GOAL

 
clearwindow,lettura,scelta.

CLAUSES           

                   /* PREMESSA

                                   Menu’ di scelta*/    

 
scelta:-nl,nl, write(”       OPZIONI  NELL’AMBIENTE STANDARD DEL”),

           
write(” TRAPEZIO RETTANGOLO”),nl,

           
nl,write(”       1) Risoluzione del problema standard”),

           
write(” (NOTI:dma,dmi,lo,db; INCOGNITO: p)”), 

           
nl,write(”       2) Fine lavoro”),

           
nl,nl,write(”  SCEGLI  UN NUMERO (1-2) “),readint(N), clearwindow,
opzione(N).

 
scelta:-clearwindow,scelta.

 

 
opzione(1):-c,risoluzione,ritorno.

 
opzione(2):-c,write(“PREMI LA BARRA SPAZIATRICE “),nl,

           
contatore(N),retract(contatore(N)).

                        

 
c:-assertz(contatore(0)),retract(condizioni(_,_)),!.

  c.

              

  ritorno:-
contatore(N),cursor(2,2),scritta_finale(N),

           
retract(contatore(N)),cursor(4,2),

           
write(“Premi un tasto per ritornare a scegliere”),READCHAR(_),

           
cursor(2,2),write(”                                         “),

           
cursor(4,2),write(”                                         “),

           
scelta. 

                          

 
scritta_finale(N):-N=0,write(” NESSUNA PROCEDURA”).

 
scritta_finale(_):-write(” NESSUN’ALTRA PROCEDURA”).

                   /*PRIMA PARTE 

                                   Descrizione
dell’ambiente                 

                                   1) Relazioni fra gli
elementi*/

 
relazione(lp,bmi,dmi,”pitagora dmi”).

 
relazione(lp,bma,dma,”pitagora dma”).

 
relazione(lo,db,lp,”pitagora diffb”).

 
relazione(sb,lp,da,”form. doppia area”).

 
relazione(da,”2″,a,”form. area”).

 
relazione(sb,sl,p,”form. perimetro”).

 
relazione(lp,lo,sl,”somma lati”).

 
relazione(bmi,bma,sb,”somma basi”).

 
relazione(bma,bmi,db,”differenza basi”).

                                   /*2) Lista degli
“elementi” costanti*/

 
lista_costanti([“2”]).

                   /* SECONDA PARTE 

     
                             Descrizione del problema

                                   1) lista degli elementi
inizialmente

                                   
noti*/                                                  

 
lista_elementi_noti([lo,dmi,dma,db]).

                                   /*2) lista degli elementi
incogniti*/                                                  

 
lista_elementi_incogniti([p]).            

                   /* TERZA PARTE 

                                   Lettura degli elementi e
delle relazioni*/

 
lettura:-findall(X,relazione(X,_,_,_),Lx),findall(Y,relazione(_,Y,_,_),Ly),

           
findall(Z,relazione(_,_,Z,_),Lz),concatena(Lx,Ly,Lp),

           
concatena(Lp,Lz,Li),insieme(Li,L),assertz(lista_elementi(L)).

 

 
lista_dati(L):- lista_elementi_noti(LL), lista_costanti(Lc),

           
concatena(LL,Lc,L).

                   /* QUARTA PARTE 

                                   Meccanismo di risoluzione
ed

                                   emissione delle
procedure*/

 
risoluzione:-input_fissi(Ld,Li),g(Li,Ld,_,[],_),!.

 
risoluzione.                  

 

 
input_fissi(Ld,Li):-lista_dati(Ld),lista_elementi_incogniti(Li),

           
lista_elementi_noti(LLd),!,assertz(condizioni(LLd,Li)).

 

 
g([],L,L,LL,LL):- contatore(N),N1=N+1,retract(contatore(N)),

           
assertz(contatore(N1)),cursor(19,1),write(“Procedura n.”,N1),

           
inverti(LL,NLL),condizioni(Ld,Li),disc1(LL,NL),        

           
cursor(2,1),WRITE(“El. noti non utilizzati= “),

           
discussione1(Ld,NL,Lf),scrivi_lista(Lf),precisazione(Lf),

           
cursor(1,1),write(“El.noti =” ),scrivi_lista(Ld),

           
cursor(1,50),write(“El.inc.=” ),scrivi_lista(Li),                

           
cursor(3,1),Write(”         TROVO      CON LA REGOLA-RELAZIONE         OPERANDO
SUGLI ELEMENTI”), 

           
scrivi(NLL,5),   cursor(22,2),

           
write( “PREMERE UN TASTO PER EVENTUALI ALTRE PROCEDURE “),

           
readchar(_),clearwindow,fail.

 
g([Z|Lv],Ld,Ld,Lr,Lr):-t(Z,[Z],Ld,Ldr,Lr,Lrr),g(Lv,Ldr,Ldr,Lrr,Lrr).

 

 
t(Z,_,Ld,Ld,Lr,Lr):- fa_parte(Z,Ld),!.

  t(Z,Lv,Ld,[Z|Ld0],Lr,[ff(Z,X,Y,R)|Lr0]):- f(Z,X,Y,R),

           
not(fa_parte(ff(Z,X,Y,R),Lr)),not(fa_parte(X,Lv)),

           
t(X,[X|Lv],Ld,Ld1,Lr,Lr1),not(fa_parte(Y,Lv)),

           
t(Y,[Y|Lv],Ld1,Ld0,Lr1,Lr0).

 

 
disc1(L,NL):-disc(L,NL,[]).

 
disc([],L,L).

  disc([ff(Z,X,Y,_)|C],Q,P):-disc(C,Q,[Z,X,Y|P]).

      

  discussione1(Ld,L,Lf):-discussione(Ld,L,Lf,[]),!.

 
discussione([],_,Lf,Lf).

 
discussione([Z|C],L,Q,P):-not(fa_parte(Z,L)),discussione(C,L,Q,[Z|P]).

 
discussione([_|C],L,Q,P):-discussione(C,L,Q,P).

 

 
precisazione([]):-write(“NESSUNO”),!.

 
precisazione(_).

 

 
scrivi([],_).

 
scrivi([ff(T,N1,N2,R)|C],J):- passo(J,NJ),cursor(NJ,12),write(T),

           
cursor(NJ,28),write(R),cursor(NJ,63),write(N1,”,”,N2),

            J1=NJ+1,scrivi(C,J1).

 

 
passo(5,NJ):-cursor(5,1),write(” Passo 1″),NJ=5,!.

  passo(J,NJ):-P=J-4,cursor(J,4),write(“,,  “,P),NJ=J.

 

  f(X,Y,Z,W):-relazione(X,Y,Z,W).

  f(X,Y,Z,W):-relazione(Y,Z,X,W).

  f(X,Y,Z,W):-relazione(Z,X,Y,W).

                    /* QUINTA PARTE 

                                     Predicati notevoli non
di sistema*/

        
fa_parte(X,[X|_]).

        
fa_parte(X,[_|C]):-fa_parte(X,C).

   

        
insieme(VL,NL):-ins(VL,NL,[]),!.

        
ins([],L,L).

        
ins([Cap|Coda],L,Q):- not(fa_parte(Cap,Q)),ins(Coda,L,[Cap|Q]).

        
ins([_|Coda],L,Q):- ins(Coda,L,Q).

 

        
concatena([],L,L).

        
concatena([Cap|Coda],L,[Cap|NCoda]):-concatena(Coda,L,Ncoda).

 

        
scrivi_lista([]).

        
scrivi_lista([Z|[]]):-write(Z),scrivi_lista([]),!.

        
scrivi_lista([Z|C]):-write(Z,”,”),scrivi_lista(C).

         

        
inverti(VL,NL):-inver(VL,NL,[]).

        
inver([],NL,NL).

        
inver([Cap|Coda],L,K):-inver(Coda,L,[Cap|K]).

 

AUTOMATISMI DI RISOLUZIONE 11                    
Condividi


Per rimanere aggiornato su tutte le novità iscriviti alla newsletter

Quando invii il modulo, controlla la tua inbox per confermare l'iscrizione

Privacy Policy