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.