Lógica y Lenguajes Formales
Transcripción
Lógica y Lenguajes Formales
Lógica y Lenguajes Formales Práctica 1 1. Usa Prolog para determinar si el siguiente argumento es valido o no: voy al cine o no voy a esquiar o no voy a jugar tenis o no voy al baile. Si hace viento y hace frio entonces voy a esquiar. Si hace sol entonces voy a jugar tenis. No voy a esquiar o voy al baile. Hace sol, frio y viento. Por lo tanto, voy al cine. 2. Usa Prolog para determinar si el siguiente argumento es valido o no: Me siento bien o no hago ejercicio o no [como bien y duermo bien] No es cierto que [hace sol y no hace frío y no me siento bien] Si el super esta abierto y tengo dinero, entonces como bien. Duermo bien si estoy cansado. Hace sol si no esta nublado. Si no esta nublado y no es invierno, no hace frio. Tengo dinero y estoy cansado. No esta nublado. Por lo tanto, me siento bien. 3. Define predicados en Prolog para no, y, o, implica y equivale (todos tienen 2 argumentos excepto no que tiene solo un argumento) que correspondan a los conectivos lógicos ¬, ∧, ∨, → y ↔; por ejemplo: y(A,B) responde ‘yes’ (evalua a trae) si y solo si ambos A y B responden ‘yes’ (evaluan a true). Dicho de otra manera A ∧ B es true si y solo si A y B son ‘true’. y(true,true) debe responder ‘yes’ mientras y(true,fail) debe responder ‘no’. Nota que A, B pueden ser otras formulas (no solamente las constantes true y fail). Una formula proposicional, por ejemplo (A ∨ B) ∧ (A →B), puede ser escrita en notación prefija como: y(o(A,B),implica(A,B)). Si no quieres usar la notación prefija puedes añadir al inicio de tu programa lo siguiente: :- op(100, fx, no). :- op(200, xfx, y). :- op(300, xfx, o). :- op(400, xfx, implica). :- op(500, xfx, equivale). Lo que te permite escribir y(o(A,B),implica(A,B)) como A o B y A implica B. Prueba tu programa con no fail o true equivale fail implica true 4. Añade lo siguiente al final de tu programa: table(L,Expr) :- bind(L), do(L,Expr), fail. do(L,_) :- disp(L,_), fail. do(_,Expr) :- Expr, !, write(true), nl. do(_,_) :- write(fail), nl. bind1(true). bind1(fail). bind([]). bind([X|R]) :- bind1(X), bind(R). disp([],_). disp([X|R],_) :- write(X), write(' '), disp(R,_). Este código usa tus predicados de la pregunta 3 para generar tablas de verdad. Por ejemplo, table([A,B,C], A y B o no C) genera la tabla de verdad: ?- table([A,B,C], true true true true true fail true fail true true fail fail fail true true fail true fail fail fail true fail fail fail A y B o no C). true true fail true fail true fail trae Usa una tabla de verdad (genérala con tu programa) para determinar si el argumento de la pregunta 1 es correcto. Entrega de la práctica: Manda un correo a [email protected] con subject “Practica 1 – Nombre (NIA)”. En el cuerpo del correo pega tus programas (solo texto) para las preguntas 1,2 y 3 así como las preguntas que le haces a Prolog para probar tu programa. Para la pregunta 4 pega la pregunta que le haces a Prolog, un pequeño extracto de lo que responde (todo sería muy largo) y explica en una frase corta que prueba lo que responde Prolog y porque.