Práctica Número 9, Curso 2004/05, Fecha 13/01/2005

1. familia

A continuación se presenta un programa Curry con información familiar

> data Persona = Ana   | Jose   | Pilar  | Emilio | Luis   | 
>                Seila | Tamara | Isabel | Manuel | Sergio

> marido Ana    = Jose
> marido Isabel = Manuel
> marido Pilar  = Emilio

> madre Sergio = Ana
> madre Seila  = Isabel
> madre Tamara = Isabel
> madre Jose   = Pilar
> madre Manuel = Pilar

> padre x = marido (madre x)

> abuelo x = padre (madre x)
> abuelo x = padre (padre x)


Compilar dicho programa y preguntar quién es el abuelo de Sergio




2. Otras preguntas

Realizar otras preguntas la base de conocimiento.

Las variables libres deben indicarse. Por ejemplo, para preguntar si hay algún padre, se debe escribir:

?- padre x where x free

Posibles preguntas:

Curry incluye el operador de igualdad =:= que establece una restricción que el sistema intenta resolver. De esa forma, para preguntar quiénes son los hijos de Manuel se puede preguntar

?- padre x =:= Manuel where x free

También es posible enlazar varias restricciones mediante el operador & que se cumple si se cumplen las dos restricciones. Por ejemplo, para preguntar si hay alguien que sea padre de Seila e hijo de Pilar podría escribirse:

?- padre Seila =:= x & madre x =:= Pilar where x free

Realizar las siguientes preguntas:




3. hermana

Curry define un tipo de datos Success que incluye la constante success. Dicho tipo de datos puede utilizarse para definir expresiones que se cumplen.

Por ejemplo, el siguiente fragmento define quienes son hombres y quienes son mujeres

> esMujer Ana    = success
> esMujer Pilar  = success
> esMujer Seila  = success
> esMujer Tamara = success
> esMujer Isabel = success

> esHombre Jose   = success
> esHombre Emilio = success
> esHombre Luis   = success
> esHombre Manuel = success
> esHombre Sergio = success



Utilizando las definiciones anteriores podría definirse, por ejemplo:

> hermana x | madre x =:= madre y & esMujer x = y
>    where y free


Nota: La respuesta a la pregunta anterior indicará también que Tamara es hermana de sí misma. Para evitar dicha respuesta, puede añadirse la restricción x =/= y que se cumple cuando x e y no son unificables.

Añadir otras definiciones familiares como tío, suegro, cuñado, etc.




4. edad




5. Viaje




6. nat

Los números naturales pueden definirse mediante el tipo de datos:

> data Nat = O      
>          | s Nat


Es posible definir la suma de números naturales como:

> suma O     y = y
> suma (s x) y = s (suma x y)     


Construir una función que indique si un número natural es menor que otro

Construir una función que multiplique 2 números naturales




7. otros (Opcional)

Definir otros predicados aritméticos como:




8. pertenece

El siguiente predicado chequea si un elemento pertenece a una lista

> pertenece x (y:_)  = x =:= y
> pertenece x (_:ys) = pertenece x ys





9. junta

La siguiente función permite juntar dos listas

> junta []     ys = ys
> junta (x:xs) ys = x : junta xs ys





10. inserta

Definir una función inserta x xs que devuelva la lista resultante de insertar x en cualquier posición de xs

?-inserta 1 [2,3]

[1,2,3] | [2,1,3] | [2,3,1]




11. permutaciones

Definir una función perm xs que devuelve una lista que es una permutación de xs.

?-perm [1,2,3]

[1, 2, 3] | [2, 1, 3] |[2, 3, 1] | [1, 3, 2] | [3, 1, 2] | [3, 2, 1]