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
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)
s (s O) y s (s O)x cumple que al sumar 2 y
x devuelve 5Construir 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:
potencia x y devuelve x
elevado a ymenor x y se cumple si x es menor que ymcd x y devuelve el máximo común divisor
de x e y8. pertenece
El siguiente predicado chequea si un elemento pertenece a una lista
> pertenece x (y:_) = x =:= y
> pertenece x (_:ys) = pertenece x ys
2 pertenece a la lista [1,2,3,4].X que pertenezca a la lista [1,2,3,4]ls que incluya al elemento 29. junta
La siguiente función permite juntar dos listas
> junta [] ys = ys
> junta (x:xs) ys = x : junta xs ys
[1,2,3,4]prefijo que se cumple si una lista es un prefijo de otrasufijo que se cumple si una lista es un sufijo de otrasublista que se cumple si una lista está incluida en otra10. 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]