Sol Prolog 2021 Ordinaria Vicálvaro
Sol Prolog 2021 Ordinaria Vicálvaro
Sol Prolog 2021 Ordinaria Vicálvaro
Apellidos: Nombre:
Grado: GII / GII-ONLINE / GII+GADE / GII+GIC / GII+GIS / GII+MAT
-mentos de la lista L), map(+Obj,?L1,?L2) (cierto si Obj se ejecuta con éxito sobre
todas las parejas de elementos de las listas L1 y L2 situados en la misma posición), Salida
Entrada include/exclude(+Obj,+L1,?L2) (cierto si L2 incluye/excluye los elementos de la lis-
ta L1 sobre los que se ejecuta con éxito Obj), pliegai(+Obj,+L,+VI,-VF), cierto si
VF es el resultado de plegar mediante Obj la lista L desde la izquierda partiendo de
✓
VI), number/integer/var/nonvar(+N) (cierto si N es un número/entero/variable/nova-
riable), call(+Obj,+E1,..) (cierto si Obj, con parámetros extra E1,.., se ejecuta con
éxito) y los predicados de recolección bagof/setof/findall(?T, +Obj, ?L).
1. (1.5 puntos) Razone qué se obtendrı́a (un error, true, false, computación infinita,
respuesta(s) que serı́a(n) ...) al ejecutar en Prolog la siguiente consulta, solicitando
todas las posibles soluciones: R :[[1,214] /[2,4]/ [4]],
TIÍ
-
NR = [71614] ,
'
t
[
-
-
-
-
?- findall(NY, (append(T,Y,[1,2,a,4]), -
length(Y,LY),
,
,
,
,
A- = 7
LY >= 2, include(integer,Y,NY)), R),
map(sumlist, R, NR), filter .NL
Mi
member(A, NR), !. Variable que almacena
representa predicado tienen que la lista con la
a los elementos recolección de las soluciones
de
corte que elemento
los ,
que vamos
a almacenar cumplir
se almacenen
Solución:
que
en la lista para
El predicado findall construye la en R lalista resultado
lista de todos los NY que resultanR de fil-
en .my
trar (include) los números enteros de
LYtodos los posibles sufijos Y de [1,2,a,4]
T tamañoY [1,2 ait ] ✓ siguientes
>= 2 las [
[[11214]]
1. 2,4 ]combinaciones:
lo cualyexisten
,
y T=[1,2], Y=[a,4],
] LY=2, NY=[4] 3(en elzresto de descomposiciones
4] [ [11214
de ] [2,4] [
,
[1,2,a,4]
/
Ziait [
ZAIT [el1]
.
[
sufijo Y tiene tamaño menor que 2).2Como2el3=2
✓
predicado findall solo se interesa
] Cait ]
=L X
3a.IT [1,2
.
por los NY,[resultará
t ] R=[[1, 2, 4], 1 [2, 4], 1 >[4]]. A continuación el predicado
] ×
tait CLR /a
map/3 aplica sumlist a cada una de las 05-2
listas de transformando cada lista
.
] [] 0 R,
at
Salt [112
.
/
NR A
Página 1 de 4
[ 716,4]
t.IT?--
( ÍL ?N)
length deuueluelalongituddelalistal-i.to
,
:
Tero
cierto si N es el número de elementos de la lista L
b Ar
]
? ( [ 1,213 ] , 3)
-
length .
True ✓
An &
.
)
? -
length ( [ 112,3 ] , N .
N =3 .
P b
3)
? -
length ( L , .
×
final :
predicado recolección de soluciones
de decir , es , devuelve
lista todos los elementos determinada condicion
qe cumplen
una con .
Los elementos se
pueden repetir yno tienen ningun orden .
include ( Integer , [ 1,2 , ait] ,
NY )
[ 1]
191T .
ánteger (1) →
112 ]
211T .
ánteger (2) → [
) [ 112 ]
311T .
ántegerca →
[ 11214 ]
ta-lt.in/-egerCt1 →
[ 2,4 ] / [ 4 ] ] NR )
mapcsumlist , [ [ 112,4 ] , ,
14T .
→
sumlist ( [ 112,4] ,
±> [ 7]
sumlist ( [ t] 4) [ 71614]
3- It . , →
member CA [ 7/6 4] )
member (7/[7,6/4])
, ,
?
pertenece
-
.
true .
se lt .
A- = 7
Elt .
A- = 6
Salt .
A- = 4
Prueba de Programación Lógica V-A – 18-11-2020 (cont.)
NR = [ 7 , 6 , → natural ( N )
R = [[1 , 2 , 4] , [2 , 4] , [ 4 ] ] ,
:-
reglas 4 ] , es _
)
A = 7.
Integer ( N ,
N >= ¢ .
2. (2 puntos) Considere el predicado ex(+L, +N, ?NL), cierto si L es una lista com-
puesta exclusivamente por términos no variables, N es un natural positivo y NL es
la lista resultante tras duplicar en L el elemento situado en la posición N, enten-
diendo que la cabeza de la lista está situada en la posición 1. El predicado no debe
producir ningún error en tiempo de ejecución y debe fallar si la operación no se
puede ejecutar porque la posición N es mayor que la longitud de L. Por ejemplo,
las consultas ?- ex(a,1,X), ?- ex([1],-1,X), ?- ex([],1,X), ?- ex([2],3,X),
?- ex([A],1,X) y ?- ex([1,2],a,X) darı́an false, ?- ex([1,2],1,[1,1,2]) de-
volverı́a true y ?- ex([1,a,5,3],3,X) darı́a X=[1,a,5,5,3] como única solución.
Proponga una implementación no recursiva para el predicado ex, basada en el uso
de algunos de los predicados mencionados al comienzo del enunciado.
88
EXCLININL ) maplnonvar / L )
ÁF
:
.
. .
-
maplnonvaril) ,
(
Solución:
natural positivo
Integer
ex (L , N, NL) :
N > ¢
(N) ,
] Nseaun
L1 L2
[ 1 / a 5/3]
,
m a p l i s t ( nonvar , L )-1°C
, ]
, L) ,
/
append ( 11112
i n t e g e r (N) ,[1. aislado [ 1 ] la / 5/3 ] [ E / El L2]
length
N >= ( L11 ,N ) ,
append
[1 , a.
533
, [
11a.SI#rC1,a ] [ 5,3 ]
( Pref , [C|R] , Lg.)[,1. 5] [3 ]
A a /
N1 i s N /1,[E] L1 ) )
appendl - ,
[ 1 / ais } ] C ,
]
[ 1ra] [ 5 ]
l e n g t h ( Pref , N1 ) , ) LZ
/ L1 ] / NL , L1 [11A 5,5/3]
append
→
, [ ,
EILZ
.
,
append ( Pref [ C,C|R] NL ) . + 5 1- [z ]
[1 ais] [1. a. 5]
]
/
[5 / [ 3]
[ 5,3] [dia, 515,3]
3. (2 puntos) Considere el predicado ex(+L, ?NL), cierto si L es una lista y NL es
la lista obtenida de L tras intercambiar el último número (empezando por la iz-
quierda) que aparece en L con el elemento situado justo a continuación suyo. Si
L no contuviese ningún número o su último número no tuviese siguiente, NL serı́a
igual a L. Por ejemplo, la consulta ?- ex(a,X) darı́a false y ?- ex([a,b],X),
?- ex([1,a,4],X), ?- ex([1,3,a],X) y ?- ex([a,1,3,c,a],X) darı́an, respecti-
vamente, X=[a,b], X=[1,a,4], X=[1,a,3] y ex([a,1,c,3,a],X) como única solu-
ción. Proponga una implementación recursiva para el predicado ex.
Página 2 de 4
C- , )
map ,
-
-
? / a)
maplnonvar L ) / forall nonvar
-
.
true .
? -
nonvar (7) .
true .
? - nonuar (X) .
false .
? [ 1 , X , a] )
-
mapcnonvar ,
.
false
? C1 /XI a] , NL )
mapcnonvari
.
C1 L , NL)
( Solución:
: - -
e. ✗ )
aux ( R , NNL ,
is listcl ), ex -
ex ( [ ] , [ ] ) .
-
]
LINL) NL = [ CINNL
[ C1 , C2(|R] , [ C2 , C1 |R ] ) :
.
ex ( aux
ex
.
CZ number (C1
aux ( [] , [
] ) ) , CB1
% C1 e s un número
ex .
[b]
-
l u d3
i n ca e ( number , [ C2 |R] CBZ
NL) :
, []) , % y e s e l ú l t i m o
1 CZIR ] ,
-
[3 ([
! .[
ex aux
-
nvmber ( C1) ,
,
[CZIR] , [ ] )
I include ( number
,
]) ,
,
ex ( [ C|R] , number
[C|NR]
,[
) CZIR
:
Fap ex (R, NR) .
NL = [ CZICDIR
] .
? ( [aiasib ] , ✗ ) .
predicado e. ✗
)
-
[b]
de
a 3
§ [ a/ b / 3]
:
[aissib ]
negación 4. Considere el siguiente código: [3ex.ae/n(Cai3ib] , ×
(not ) C1 : a
mist([], 0). CZ:3
mist([C|R], N) :- R Eaib/ 3]
( Ca 3lb] / X )
number(C),
[4 ex aux ,
ca.yni.p.biz#
!, -
mist(R, NR),
-
C1 :3
/
N is NR+1.
R :[]
(a) (0.5 puntos) Describa en lenguaje natural (con sus propias palabras) el cometido
del predicado anterior: “mist(L,N) es cierto si ...”
NL = [a / b) 3 ]
Solución:
mist(L,N) es cierto si N es el número de elementos de la lista L que NO son
números.
(b) (1.5 puntos) ¿Presenta el código anterior recursión de cola (recursión final)?
Justifique su respuesta y proponga una implementación alternativa, con o sin
recursión de cola dependiendo de su respuesta a la pregunta anterior.
Solución:
La implementación propuesta no tiene recursión de cola puesto que en la
tercera cláusula se realiza una suma después de la llamada recursiva. Una
implementación alternativa, incorporando un parámetro de acumulación pa-
ra conseguir recursión de cola, podrı́a ser la siguiente:
m i s t c (L , N) :
m i s t c (L , 0 , N ) .
m i s t c ( [ ] , Ac , Ac ) .
m i s t c ( [ C|R] , Ac , N) :
number (C) ,
!,
Página 3 de 4
V12 C])
V3
e. ✗ ( + Li ? NL ) a [3lb]
ex ( [] , .
( [ CIR ] , CCINNL )
X
C} ex
] :-( R
aux
( L , NL)
:
C1
[ (2×[11/2]) :
- -
¡s _
, ex ,
ex aux ( LINL)
( C1 ) ,
.
number
_
CZ [ ])
( [] ,
CB1
CZIR ])
[ ltnumber , [
ex aux .
]
-
3 [ b
a ) CBZ
] , [CZICLIR ]
: -
.
[CZIR] , [ ] ) map
nvmber ( C1) ,
I include ( number
,
CZIR] ) .
→④
,
number, [
predicado ex ex
1)
- -
de § [ "" b " }]
R:[ ¡¡
negación [3ex.ae/n(Cai3ib] , ✗
ex ( R , NNL ) .
(not ) C1 : a
CZ:3
3]
'
? -
par ([42,3/4]/11) .
[+ ex aux ( ca }, ,] ,
,
csizm.p.biz#
X)
-
C. a
? ( a/ ✗ =L
R :[sib]
FÍE} - ex .
;
☒ ex auxcczib] ,
,
11=4
/
falsa ;
-
C2 :b
R :C] false .
NL = [a / b) 3]
Prueba de Programación Lógica V-A – 18-11-2020 (cont.)
m i s t c (R, Ac , N ) .
m i s t c ( [ |R] , Ac , N) :
NAc i s Ac + 1,
m i s t c (R, NAc , N ) .
5. (2.5 puntos) Dados el programa que se incluye en la otra cara de esta hoja y la
consulta
?- - q(X,Y), \+ m(X).
Solución:
El árbol de Resolución asociado tiene, de izquierda a derecha, las siguientes ramas
(en el examen habı́a que dibujarlo): una rama fallo, una rama podada por un corte,
una rama fallo, una rama éxito con respuesta asociada X=c, Y=b, otra rama fallo,
una rama éxito con respuesta X=a, Y=b y una rama podada por un corte.
Además de dibujar el árbol, de acuerdo con el enunciado, era necesario:
Acompañar cada una de las soluciones de los cálculos que permiten obte-
nerlas (aplicando a cada una de las variables de la consulta los umg’s de la
rama éxito correspondiente, en orden, empezando por la raı́z).
Indicar qué respuestas ofrece Prolog ante la consulta dada y en qué orden
las da: dado que Prolog construye el árbol en profundidad por la izquierda,
ignorando tanto ramas fallo como ramas podadas, la primera respuesta serı́a
X=c, Y=b, la siguiente X=a, Y=b y acabarı́a con un false (indicando que
no hay más respuestas).
Página 4 de 4