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