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.

Documentos relacionados