SOLUCION EXAMEN Lógica en la Informática

Transcripción

SOLUCION EXAMEN Lógica en la Informática
SOLUCION EXAMEN Lógica en la Informática
1 de julio 2005
Teorı́a 1 (3 puntos)
A: Demuestra paso por paso la completitud refutacional de la resolucion unitaria para cláusulas de
Horn en lógica proposicional. Atención: la demostración debe ser breve, limpia y clara.
Ver los apuntes
B: Demuestra la incompletitud refutacional de la resolucion unitaria para cláusulas cualesquiera (no
de Horn) en lógica proposicional.
Contraejemplo: {pvq, -pvq, pv-q, -pv-q} es insat y cerrado bajo resolucion unitaria.
Teorı́a 2 (2 puntos) En logica proposicional, ¿decidir la satisfactibilidad para fórmulas cualesquiera
tiene mayor, menor, o igual coste computacional (asintótico) que para conjuntos de cláusulas con como
máximo tres literales? Explica de manera breve, limpia y clara por qué.
Igual coste.
3-SAT no puede tener mayor coste que para formulas arbitrarias, porque es un
caso particular de fórmula.
3-SAT tampoco puede tener menor coste que para formulas aribitrarias F, porque
existe una manera de transformar el problema de SAT para F en un problema de
3-SAT, haciendo crecer el tama~
no del problema solo linealmente.
Esta reduccion se basa en la introduccion de un simbolo nuevo para cada
nodo (and/or/not) de la formula F vista como arbol. Por ejemplo, si un nodo G es
el AND de G1 y G2, y p1 y p2 son los simbolos para G1 y G2, entonces G genera las
clausulas {-p1 v -p2 v p, -p v p1, -p v p2} que especifican que p <-> (p1 AND p2).
Teorı́a 3 (2.5 puntos)
A: En lógica proposicional, supon que te dan un interpretacion I como una lista de n bits para los
sı́mbolos p1 , . . . pn . ¿Cuál es la complejidad de decidir si I satisface una fórmula dada?
Lineal: en un solo recorrido de la formula podemos evaluarla.
B: En lógica de primer orden, supon que te dan un interpretacion I con un dominio finito, especificando
totalmente el comportamiento de todas las funciones. ¿cuál es la complejidad de decidir si I satisface
una fórmula dada?
Los mejores algoritmos que se conocen son exponenciales.
Por ejemplo, si el dominio es {a,b}, y hay un simbolo de predicado
P tal que P_I(a)=1 y P_I(b)=0, evaluar una formula de la forma:
paratodo x1 existe y1 ... paratodo xn existe yn F
obliga a comprobar 2^n casos.
C: En lógica de primer orden, para una interpretacion I conocida de dominio infinito (por ejemplo,
los naturales, enteros, o reales), ¿cuál es la complejidad de decidir si I satisface una fórmula dada?
No es decidible. No existe ningun algoritmo que decida si un polinomio en varias
variables tiene raices enteras, lo cual equivale a decidir si es cierta en los enteros
una formula del estilo:
existe x existe y 4*x*x*x*y + 3*x*x + ... + 17 = 0.
Teorı́a 4 (2.5 puntos). Sea F la fórmula ∀x ∃y ∀z P (x, y, z)∧Q(y), y sea G ∀x ∀y P (x, f (x), y)∧Q(a).
¿Alguna es consecuencia lógica de la otra? ¿Son lógicamente equivalentes? Demuéstralo.
Ninguna es consecuencia logica de la otra:
I satisface F pero no G, si:
D_I es {c,d}
f_I siempre da c
a_I es d
Q_I siempre da 1
P_I da 1 ssi el segundo argumento es d
I satisface G pero no F, si:
D_I es {c,d}
f_I siempre da d
a_I es c
Q_I(c) da 1
Q_I(d) da 0
P_I da 1 ssi el segundo argumento es d
Labo 1 (4 puntos) Completa el siguiente procedimiento al estilo de DPLL en prolog. Impleméntalo
todo, excepto leerclausulas(F), que lee una lista de cláusulas, donde cada cláusula es una lista de
enteros, por ej., p3 ∨ ¬p6 ∨ p2 se representa [3,-6,2]. Es obligatorio seguir las indicaciones. Hazlo lo
más simple posible y pon bien los cortes “!” para no perder eficiencia.
p:- leerclausulas(F), dpll([],F).
p:- write(’UNSAT’),nl.
dpll(I,[]):- write(’ES SAT. Modelo: ’), write(I),nl,!.
dpll(I,F):decision_lit(F,Lit),%Debe escoger una cláusula unitaria si hay; si no, uno cualquiera.
simplif(Lit,F,F1), %Simplifica F. Ojo: puede fallar y provocar backtracking
dpll([Lit|I],F1).
decision_lit(F,Lit):- member([Lit],F),!. % unit propagation: ojo al corte!!!
decision_lit([[Lit|_]|_],Lit).
decision_lit([[Lit|_]|_],Lit1):- Lit1 is -Lit.
simplif(_,[],[]).
simplif(Lit,[C|F], F1 ):- member(Lit,C),!,
simplif(Lit,F,F1),!.
simplif(Lit,[C|F],[D|F1]):- Lit1 is -Lit, delete1(Lit1,C,D),!,D\=[], simplif(Lit,F,F1),!.
simplif(Lit,[C|F],[C|F1]):simplif(Lit,F,F1),!.
delete1(X,[X|L],L).
delete1(X,[Y|L],[Y|L1]):- delete1(X,L,L1).
Labo 2 (3 puntos) Haz un programa prolog ciclos que escribe todos los ciclos que hay en un
grafo dirigido cuyas aristas estan especificadas mediante hechos prolog de la forma arista(X,Y). En
el siguiente ejemplo, [4,5,6,4] es un ciclo.
arista(3,4).
arista(4,5).
arista(5,6).
arista(6,4).
arista(1,2).
arista(2,6).
ciclos:- arista(X,Y), cic([X,Y]).
ciclos.
cic(L):- append(_,[X],L), arista(X,Y), L=[Y|_],
append(L,[Y],C), write(C),nl,fail.
cic(L):- append(_,[X],L), arista(X,Y), \+member(Y,L), append(L,[Y],C), cic(C).
Labo 3 (3 puntos) Escribe un predicado Prolog log(B,N,L) que calcula la parte entera L del
logaritmo en base B de N, donde B y N son naturales positivos dados. Por ejemplo, ?- log(2,1020,L).
escribe L=9? Podéis usar la exponenciación, como en 125 is 5**3. El programa (completo) no debe
ocupar más de 3 lineas.
log(B,N,K):- nat(K), L is B**K, L1 is B**(K+1),
nat(0).
nat(N):- nat(N1), N is N1+1.
N>=L, N<L1.

Documentos relacionados