Lógica: práctica 2
|
|
:- op(1060, yfx, <->). % doble implicación :- op(1050, yfx, <-). % implicación hacia la izquierda :- op(600, yfx, v). % disyunción:- op(400, yfx, &). % conjunción :- op(200, fx, forall). % universal:- op(200, fx, exists). % existencial :- op(300, xfy, ::). % separador para cuantificadores |
El programa Prolog deberá contener la definición de
los predicados subs/3
y subs_list/3 que
definimos a continuación
1. Predicado subs(X/T, F ,G)
Realizará la sustitución de toda aparición libre de
la variable X
reemplazándola por el término T en la
fórmula de entrada F devolviendo como resultado la
fórmula G.
Estos son algunos ejemplos de consultas con ese
predicado:
?- subs(x/4, p(f(x),y),
G).
G = p(f(4), y).
?- subs(x/f(a), exists
y :: q(y,x) & forall x :: p(x), G).
G = exists y::q(y, f(a))&forall
x::p(x).
Por simplicidad,
supondremos que la fórmula que nos pasan está bien
construida (no es necesario comprobarlo).
Por ejemplo, no necesitamos comprobar que nos
pasen expresiones mal construidas como subs(x/4, 3
:: [x]+5 , G) donde está claro que la expresión "3
:: [x]+5" no es una fórmula bien formada, a pesar
de ser un término Prolog.
También supondremos que el
término T
no contiene ninguna variable ya cuantificada en la
fórmula F.
De lo contrario, algunas sustituciones serían
incorrectas. Por ejemplo, esta sustitución:
?- subs(x/y, q(x) &
exists y :: p(x,y), G).
G = q(y)&exists y::p(y, y).
es incorrecta en
lógica, porque la variable y que
introducimos de primer parámetro del predicado p
debería quedar libre, y no ligada al cuantificador
exists, como ocurre en el resultado
arriba mostrado.
Ejercicio opcional:
reforzar el predicado subs/2 para que compruebe estas situaciones, de
modo que si tenemos cualquier identificador
atómico a en T que luego aparezca nombrado como una
variable cuantificada en F, el predicado devuelve false y
muestre un mensaje:
?- subs(x/y, q(x) &
exists y :: p(x,y), G).
Error: no se puede cambiar x/y porque y está
cuantificada en exists y :: p(x,y)
false
2. Predicado subs_list(L, F ,G)
Realizará la secuencia de sustituciones X/T contenidas en la lista L de forma acumulada, una tras otra, sobre la fórmula F para devolver la fórmula final G. Cada sustitución realizará una llamada al predicado subs/3 del paso anterior. Ejemplo de consulta:Esta práctica tiene una puntuación máxima
de 2 puntos (20% del total del curso). La
práctica se realizará preferentemente en grupos de 2
alumnos (repitiendo el grupo de la práctica 1). La
entrega se realizará en una tarea del Campus Virtual
(moodle): es suficiente con realizar la entrega en una
de las dos cuentas de alumnos, pero el código debe
incluir en las primeras líneas en comentarios los
nombres de los dos componentes del grupo. Fecha de
entrega: 14 de mayo de 2026
(23:59).