 |
Dare un programma in Prolog che definisca la relazione tra due
liste di avere l'una lunghezza doppia dell'altra.
definizione del predicato lunghezza
definiamo le due clausole: la condizione di uscita (un fatto) stabilisce
che la lista vuota ha lunghezza 0. Il caso ricorsivo (una regola) dice che
la lunghezza puo' essere calcolata sommando 1 alla coda della lista:
lunghezza([],0).
lunghezza([A|B],N):- lunghezza(B,N1), N is N1+1.
definiamo il predicato listadoppia
listadoppia(X,Y):- lunghezza(X,A), lunghezza(Y,B), A is 2*B.
Seconda soluzione (piu' elegante):
listadoppia2([],[]).
listadoppia2([X1,X2|Y], [A|B]):- listadoppia2(Y,B).
Dare un programma in Prolog che definisca, tra un elemento e una lista, la relazione
"ultimo elemento della lista".
ultimo(X,[X]). % l'elemento X e' il primo e l'ultimo elemento
ultimo(X,[_|Y]):- ultimo(X,Y). % della lista contenete solo X ricorsivamente
% riapplico il predicato ultimo alla coda della lista
Dare un programma in Prolog che definisca la seguente relazione tra due liste:
"le due liste non hanno elementi in comune".
% le due liste sono differenti se:
differenti([A|_],[X|_]):- A\=X. % il primo elemnto della lista e' diverso dal primo
% elemento della seconda lista oppure se confronto
differenti([A|_],[_|Y]):- differenti(A,Y). % ricorsivamente il primo elemento della lista con
% la coda della seconda lista, con lo stesso
differenti([_|B],[_|Y]):- differenti(B,Y). % procedimento della clausola precedente
Soluzione n.2 di Marco Lizza:
non_in_lista(X, []).
non_in_lista(X, [A|B]) :- X\=A, non_in_lista(X, B).
differenti([A|B], L) :- non_in_lista(A, L), differenti(B, L).
Antonio Piccolo propone la correzione del programma n.2:
una soluzione è inserire tra i fatti "differenti([], X)."
Dunque il programma corretto è:
nonin(X, []).
nonin(X,[C|D]):- X\=C , nonin(X,D).
differenti([], X).
differenti([A|B],C):- nonin(A,C) , differenti(B,C).
Dare un programma in Prolog che definisca la seguente relazione tra un albero
binario ed una lista: "la lista contiene la frontiera dell'albero binario".
frontiera (VOID, []).
frontiera (btree(X,VOID,VOID), [X]).
frontiera (btree(X,A,B), L) :- frontiera (A,L1), frontiera (B,L2), append(L1,L2,L).
Dare un programma in Prolog che definisca la relazione tra due alberi binari
di avere la stessa struttura.
stessaStrutt(VOID,VOID).
stessaStrutt((A,A1,A2),(B,B1,B2)) :- stessaStrutt(A1,B1), stessaStrutt(A2,B2).
Dare un programma in Prolog che definisca la relazione "nodiInterni" tra un
albero binario e un naturale, tale che il numero naturale indichi il numero di nodi
interni dell'albero
nodiInterni(VOID,0).
nodiInterni((X,VOID,VOID),0).
nodiInterni((A,A1,A2),N) :- nodiInterni(A1,N1), nodiInterni(A2,N2), N = N1+N2+1.
Implementare un predicato prolog che prenda due orari nella forma hh,mm
e da' un successo se la differenza e' maggiore o uguale a 30 min.
Soluzione (di Nicola Veleda)
supera30min(H1, M1, H2, M2) :- H1*60 + M1 >= H2 * 60 + M2 + 30.
supera30min(H1, M1, H2, M2) :- H2*60 + M2 >= H1 * 60 + M1 + 30.
© C o p y r i g h
t 1 9 9 4 - 2 0 1 1
w w w . d i z i o n a r i o i n f o r m a t i c o . c o m |
 |
|