fatti-regole 1
liste 2
liste 3
liste 4
cut 5
cut 6
aritmetica 7
aritmetica 8
liste 9
cut 10
#
Siano dati i seguenti fatti e le seguenti regole:
grosso(orso). grosso(elefante). piccolo(gatto). marrone(orso). nero(gatto). grigio(elefante). scuro(Z) :- nero(Z). scuro(Z) :- marrone(Z).Quale sarà la risposta del Prolog all'interrogazione:
?- scuro(X),grosso(X).
Dire quali delle seguenti divisioni di liste in testa (T) e coda (C) sono corrette.
&
0[T|C]=[a,[b,c]],T=a, C=[b,c]
0[T|C]=[a,[b,c],d],T=a, C=[b,c,d]
1[T|C]=[a,[b,c]],T=a, C=[[b,c]]
0[T|C]=[a],T=a, C=_
1[T|C]=[a],T=a, C=[]
0[T|C]=[[a,b]],T=a, C=[b]
1[T|C]=[[a,b]],T=[a,b] C=[]
1[T|C]=[[]],T=[], C=[]
#
#
Dire quale sarà il risultato del matching:
[X,Y|Z] = [[a,b,c],[e,f]]
&
il match non è possibile
X=a, Y=b, Z=[c]
X=[a], Y=[e], Z=[]
X=[a,b,c], Y=[e,f], Z=_
*X=[a,b,c], Y=[e,f], Z=[]
#
#
Date le definizioni:
primo([Ele|_],Ele). secondo([_,Ele|_],Ele). terzo([_,_,Ele|_],Ele).dire quale sarebbe la risposta dell'interprete Prolog alla seguente domanda:
Tom, Jim, Ann e Pat sono dei giocatori di tennis.
Il predicato classe(Giocatore,Categoria) li divide in
tre categorie: combattenti, vincitori e sportivi.
Sia dato il seguente programma:
classe(X,combattente) :- ha_battuto(X,_), ha_battuto(_,X), !. classe(X,vincitore) :- ha_battuto(X,_), !. classe(X,sportivo) :- ha_battuto(_,X). ha_battuto(tom,jim). ha_battuto(ann,tom). ha_battuto(pat,jim).Dire quali dei seguenti goal avranno successo:
Sia dato il seguente programma:
ama(maria,X):- gatto(X), !, fail. ama(maria,X):- animale(X). animale(X):-cane(X). animale(X):-gatto(X). cane(fido). gatto(fufi).Dire quali dei seguenti goal avranno successo:
Dire quali dei seguenti goal avranno successo:
&
1Z is 3+5, 2*Z =:= 4*4
0Z is 3+5, 2*Z = 4*4
0Z is 3+5, 2*Z =\= 4*4
1Z is 3+5, 2*Z \= 4*4
#
#
Se chiediamo all'interprete Prolog di soddisfare il seguente goal
X=3,Y=2*6,Z is X + Y
quale risposta otterremo?
&
*Z=15
Z=3+2*5
Z=X + Y
Yes
No
#
#
Siano dati i fatti:
frutta(mele). frutta(pere). frutta(fragole). frutta(banane). ... ... verdura(broccoli). verdura(cavoli). verdura(spinaci). verdura(carote). ... ...Scrivere un predicato separa(Lista,Frutta,Verdura) che divida una lista di ingresso in due liste, la prima contenete solo la frutta, la seconda solo verdure. Esempio:
separa([spinaci,mele,pere,broccoli,carote,fragole],Frutta,Verdura). YES Frutta = [mele,pere,fragole] Verdura= [spinaci,broccoli,carote]
# #Soluzione: # # separa([],[],[]). # separa([T|C],[T|Frutta],Verdura) :- # frutta(T),separa(C,Frutta,Verdura). # separa([T|C],Frutta,[T|Verdura]) :- # verdura(T),separa(C,Frutta,Verdura). ##
Scrivere un predicato
del(Elemento,Lista,Risultato)che elimini da Lista solo la prima occorrenza di Elemento. Risultato e' la lista cosi' ottenuta. Il predicato del deve fallire se l'elemento da cancellare non viene trovato nella lista. Esempio:
?- del(y,[x,y,z,t,z,y,x],L). YES L=[x,z,t,z,y,x] ?- del(k,[x,y,z,t,z,y,x],L). NO
# #Soluzione # # del(X,[X|L],L) :- !. # del(X,[T|L],[T|L1]) :- del(X,L,L1). ## #
Scrivere un predicato
in_lettere(L1,L2)che abbia come input una lista di numeri interi compresi fra 1 e 20 L1 e la trasformi in una lista L2 contenete gli stessi numeri espressi in lettere. Il predicato trasla fara
cambia(1,uno). cambia(2,due). cambia(3,tre). ...... ...... cambia(20,venti).Esempio:
?- in_lettere([3,7,19],L). YES L=[tre,sette,diciannove].
in_lettere($0:30:$).
in_lettere($1:30:$) :-
cambia($2:30:$),
in_lettere($2:30:$).
#Soluzione
#
# in_lettere([],[]).
# in_lettere([T|C],[T1|C1])) :-
# cambia(T,C),
# in_lettere(T1,C1).
#
#
#
Esempio:
?- somma([3,-5,0,-8,4,22],Spos,Sneg).
YES
Spos = 29,
Sneg = -13.
somma([],$0:10:$).
somma([T|C],Spos,Sneg) :-
T >= 0, somma($1:30:$),
$2:10:$ is $3:20:$ .
somma([T|C],Spos,Sneg) :-
T < 0, somma($4:30:$),
$5:10:$ is $6:20:$ .
# # Soluzione # somma([],0,0). # somma([T|C],Spos,Sneg) :- T >= 0, somma(C,Spos1,Sneg), Spos is Spos1 + T. # somma([T|C],Spos,Sneg) :- T >= 0, somma(C,Spos1,Sneg), Spos is Spos1 + T. # ##
Si vuole scrivere un predicato
piu_lunga(L1,L2)Questo predicato deve avere successo se la lista L1 é (strettamente) pił lunga della lista L2 e fallire altrimenti.
Esempio:
?- piu_lunga([a,b,c,d,e],[a,b,c]). YES ?- piu_lunga([a,b,c],[a,b,c]). NO ?- piu_lunga([a,b,c],[a,b,c,d]). NOQuesta è una definizione del predicato piu_lunga che però contiene alcuni errori. Correggeteli.
piu_lunga($0:30:[X],[]$).
piu_lunga([T|C],$1:30:Y$) :-
piu_lunga(C,$2:30:Y$).
&
# ##Con errori #piu_lunga([X],[]). #piu_lunga([T|C],Y) :- # piu_lunga(C,Y). # #Soluzione corretta #piu_lunga([X|Y],[]). #piu_lunga([T|C],[X|Y]) :- # piu_lunga(C,Y). ## #
# # # # #Test finale - Liste + Aritmentica con errori - n.9014
# 9014 4 aritmetica 11 #Si vuole scrivere un predicato
somma_quad(ListaInt,Somma)Questo predicato deve calcolare la somma Somma dei quadrati dei numeri interi contenuti nella lista ListaInt.Esempio:
?- somma_quad([5,2,3],Somma). YES SommaQuad = 18.Questa è una definizione del predicato somma_quad che però contiene alcuni errori. Correggeteli.somma_quad($0:10:[X],X*X$). somma_quad([T|C],S) :- piu_lunga($1:10:C,S$), $2:10:S is S$ + T * T.
&
# ##Con errori #somma_quad([X],X*X). #somma_quad([T|C],S) :- # piu_lunga(C,S), # S is S + T * T. #Soluzione corretta #somma_quad([],0). #somma_quad([T|C],S) :- # piu_lunga(C,S1), # S is S1 + T * T. ## #
# #