Test finale

Elenco domande:

fatti-regole 1
liste 2
liste 3
liste 4
cut 5
cut 6
aritmetica 7
aritmetica 8
liste 9
cut 10
#


# # #

Test finale - Fatti e regole - n.9001

# 9001 1 fattiregole 1 #

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).

&
*Yes, X=orso.
Yes, X=gatto.
Yes, X=elefante.
No
# #
# # #

Test finale - Liste - n.9002

# # 9002 2 liste 2 #

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=[]
# #


# # #

Test finale - Liste - n.9003

# 9003 1 liste 3 #

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=[]
# #


# # #

Test finale - Liste - n.9004

# 9004 1 liste 4 #

Date le definizioni:

primo([Ele|_],Ele).
secondo([_,Ele|_],Ele).
terzo([_,_,Ele|_],Ele).
dire quale sarebbe la risposta dell'interprete Prolog alla seguente domanda:
terzo([a,b,[c,d],e],X) ,secondo(X,Ele)

&
no
yes, Ele=a
yes, Ele=b
yes, Ele=c
*yes, Ele=d
yes, Ele=e
yes, Ele=[c,d]
# #
# # #

Test finale - CUT - n.9005

# 9005 2 cut 5 #

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:
&
1?- classe(tom,X), X = combattente.
0?- classe(tom,X), X = vincitore.
0?- classe(tom,X), X = sportivo.
0?- classe(jim,X), X = combattente.
0?- classe(jim,X), X = vincitore.
1?- classe(jim,X), X = sportivo.
0?- classe(ann,X), X = combattente.
1?- classe(ann,X), X = vincitore.
0?- classe(ann,X), X = sportivo.
0?- classe(pat,X), X = combattente.
1?- classe(pat,X), X = vincitore.
0?- classe(pat,X), X = sportivo.
# #
# # #

Test finale - CUT - n.9006

# 9006 2 cut 6 #

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:
&
1?- ama(maria,fido).
0?- ama(maria,fufi).
0?- ama(X,fufi).
1?- ama(X,fido).
0?- ama(maria,X).
0?- ama(X,Y).
# #
# # #

Test finale - Espressioni aritmetiche - n.9007

# 9007 2 aritmetica 7 #

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
# #


# # #

Test finale - Espressioni aritmetiche - n.9008

# 9008 1 aritmetica 8 #

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
# #


# # #

Test finale - LISTE - n.9009

# 9009 3 liste 9 #

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). 
#
#
# # #

Test finale - CUT - n.9010

# 9010 3 cut 10 #

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). 
#
# #
# # # #

Test finale - Liste - n.9011

# 9011 4 cut 11 #

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 uso dei fatti cambia, per traslare singoli numeri.
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).
#
# #
# # # # #

Test finale - Liste + aritmetica- n.9012

# 9012 4 12 aritmetica Scivere un predicato somma(ListaInt,Spos,Sneg) che, data una lista di numeri interi ListaInt, calcoli separatamente la somma dei numeri positivi Spos e di quelli negativi Sneg.

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.  
#
#
#
# # # #

Test finale - Liste con errori - n.9013

# 9013 4 cut 11 #

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]).
NO
Questa è 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.
#
# #
# #