commit d6b34c353cedc8ed0c62f70feb0be75ebc7b5191 Author: Carlos Galindo Date: Mon Oct 15 18:55:06 2018 +0200 Práctica 2: initial commit diff --git a/p2/familia.pl b/p2/familia.pl new file mode 100644 index 0000000..421297a --- /dev/null +++ b/p2/familia.pl @@ -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). + diff --git a/p2/fiesta.pl b/p2/fiesta.pl new file mode 100644 index 0000000..d74fbab --- /dev/null +++ b/p2/fiesta.pl @@ -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). diff --git a/p2/menu.pl b/p2/menu.pl new file mode 100644 index 0000000..a5a4e76 --- /dev/null +++ b/p2/menu.pl @@ -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). + diff --git a/p2/practica2.tex b/p2/practica2.tex new file mode 100644 index 0000000..62b377c --- /dev/null +++ b/p2/practica2.tex @@ -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} diff --git a/p2/sociedad.pl b/p2/sociedad.pl new file mode 100644 index 0000000..b00a51b --- /dev/null +++ b/p2/sociedad.pl @@ -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). +