Práctica 2: initial commit

This commit is contained in:
Carlos Galindo 2018-10-15 18:55:06 +02:00
commit d6b34c353c
5 changed files with 155 additions and 0 deletions

13
p2/familia.pl Normal file
View file

@ -0,0 +1,13 @@
padrede(juan, maria).
padrede(pablo, juan).
padrede(pablo, marcela).
padrede(carlos, debora).
padrede(luisa, debora).
hijode(B, A) :- padrede(A, B).
hermanode(A, C) :- padrede(B, A), padrede(B, C), A\==C.
abuelode(A, C) :- padrede(A, B), padrede(B, C).
familiarde(A, B) :- padrede(A, B).
familiarde(A, B) :- hijode(A, B).
familiarde(A, B) :- hermanode(A, B).
familiarde(A, B) :- abuelode(A, B).

29
p2/fiesta.pl Normal file
View file

@ -0,0 +1,29 @@
hombre(alfredo).
hombre(felipe).
hombre(francisco).
mujer(sonia).
mujer(eva).
mujer(carmen).
bebe(alfredo, whisky).
bebe(alfredo, ron_cola).
bebe(felipe, cerveza).
bebe(felipe, gin_tonic).
bebe(felipe, ron_cola).
bebe(francisco, vino).
bebe(francisco, malibu).
bebe(sonia, gin_tonic).
bebe(sonia, malibu).
bebe(eva, vino).
bebe(eva, cerveza).
bebe(carmen, whisky).
bebe(carmen, ron_cola).
/* Ejercicio 2a */
pareja(X, Y) :- bebe(X, B), bebe(Y, B), hombre(X), mujer(Y).
/* Ejercicio 2b */
hombre(pepe).
bebe(pepe, X) :- bebe(alfredo, X).
mujer(elena).
bebe(elena, X) :- bebe(sonia, X).
bebe(elena, X) :- bebe(felipe, X).

14
p2/menu.pl Normal file
View file

@ -0,0 +1,14 @@
primero(ensalada).
primero(sopa).
primero(revuelto).
segundo(chuleta).
segundo(lubina).
segundo(pollo).
postre(natillas).
postre(flan).
postre(cafe).
comida(X, Y, Z) :- primero(X), segundo(Y), postre(Z).

84
p2/practica2.tex Normal file
View file

@ -0,0 +1,84 @@
\documentclass{article}
\usepackage{listings}
\usepackage[utf8]{inputenc}
\author{Carlos Santiago Galindo Jiménez}
\title{Práctica 2 - Prolog}
\date{15 de octubre de 2018}
\begin{document}
\maketitle
\section{Ejercicios}
\subsection{Ejercicio 1}
El fichero ``familia.pl'' contiene:
\lstinputlisting[language=Prolog]{familia.pl}
Cargado en la consola interactiva de Prolog con ``consult(familia)''
\subsection{Ejercicio 2}
Al consultar ``hijode(X, pablo).'' o ``padrede(pablo, X).'', se obtiene el resultado ``X = juan ; X = marcela.''
Al pulsar `r' se busca si queda algún otro resultado, se muestra el final de los resultados o `false', indicando que no hay más resultados.
\subsection{Ejercicio 3}
\begin{itemize}
\item Consultar quién es abuelo de María: ``abuelode(X, maria)'' con X = pablo ; false.
\item Consultar todos los familiares de Pablo conocidos: ``familiarde(pablo, X). familiarde(X, pablo).''. El resultado es Juan, Marcela y María. Si la consulta sólo incluyera una de las dos, podría omitirse algún resultado, puesto que ``familiarde(A, B)'' no es simétrico.
\item Consultar todas las personas que son familia de Débora: ``familiarde(debora, X). familiarde(X, debora).'', resultando en Carlos y Luisa.
\item Añadir regla ``nietode'': nietode(X, Y) :- abuelode(Y, X).
\item Averiguar de quién es nieta María: nietode(maria, X).: Pablo
\item Diferencia entre incluir ``nietode'' en ``familiarde'': las consultas ahora son completamente simétricas, puesto que todas las relaciones (padre/hijo, abuelo/nieto y hermano) son simétricas. Una alternativa hubiera sido incluir la regla ``familiarde(A, B) :- abuelode(B, A).''
\end{itemize}
\section{Practicando con Prolog}
\subsection{Unificación}
\begin{itemize}
\item ``padrede(X, debora) = padrede(carlos, debora)'' sí que unifica, con X = carlos.
\item ``X = fecha(10, nov, Y)'' sí que unifica, a la misma expresión.
\item ``fecha(10,oct,2013) = fecha(X,nov,2013)'' no unifica, ya que oct\\==nov.
\item ``momento(fecha(10,nov,2013), Y) = momento(X, hora(13,05))'' sí que unifica, con X = fecha(10,nov,2013) e Y = hora(13,05).
\end{itemize}
\subsection{Definiendo propiedades}
El fichero ``fiesta.pl'' contiene el programa Prolog describiendo las bebidas favoritas de cada persona. Para el predicado pareja(X, Y) tenemos dos condiciones; la primera que los argumentos sean respectivamente hombre y mujer y la segunda que ambos argumentos tengan una bebida en común: ``pareja(X, Y) :- hombre(X), mujer(Y), bebe(X, B), bebe(Y, B).''.
En segundo lugar, para añadir una preferencia de bebida basada en las preferencias de otros, simplemente asignamos a dicha persona una consulta: ``bebe(pepe, X) :- bebe(alfredo, X).'', y en el caso de Elena, necesitamos una para Sonia y otra para Felipe: ``bebe(elena, X) :- bebe(sonia, X). bebe(elena, X) :- bebe(felipe, X).''.
\subsection{Representación del conocimiento}
Se definen las siguientes propiedades: rufian, noble, plebeyo, dama, hermosa, deseara y raptara.
\lstinputlisting{sociedad.pl}
\subsection{Consultas a la base de conocimiento}
\begin{itemize}
\item ¿Qué noble es un rufián? rufian(X), noble(X). X = bertoldo.
\item ¿A quién podría raptar Romeo? raptara(romeo, X). false.
\item ¿Quién puede raptar a Julieta? raptara(X, julieta). X = bertoldo; X = bartolo; false.
\item ¿Quién rapta a quién? raptara(X, Y).\\
X = bertoldo, Y = julieta; \\
X = bartolo, Y = gertrudis;\\
X = bartolo, Y = julieta; \\
\item ¿A quién desea Bartolo? deseara(bartolo, X). X = gertrudis; X = julieta; false.
\item ¿Y Romeo? deseara(romeo, X). X = julieta.
\item ¿Qué hermosa dama es deseada por Bartolo? deseara(bartolo, X), dama(X), hermosa(X). X = julieta ; false.
\end{itemize}
\subsection{Obteniendo las resupestas a una consulta}
En el intérprete de Prolog SWI-Prolog (versión 6.6.1), el orden de los resultados depende del orden en el cual están declaradas las propiedades. Además, se busca con una estrategia en profundidad, de tal manera que la consulta ``comida(X, Y, Z).'' fijará valores para las tres variables y a continuación iterará empezando por variar Z, a continuación Y y Z y finalmente X, Y y Z.
\end{document}

15
p2/sociedad.pl Normal file
View file

@ -0,0 +1,15 @@
rufian(bertoldo).
rufian(bartolo).
noble(romeo).
noble(bertoldo).
plebeyo(bartolo).
dama(gertrudis).
dama(julieta).
hermosa(julieta).
deseara(X, Y) :- plebeyo(X), dama(Y).
deseara(X, Y) :- noble(X), dama(Y), hermosa(Y).
raptara(X, Y) :- rufian(X), deseaa(X, Y).