Definir dominios para representar personas con nombre, apellido, edad, etc.
Definir dominios para representar libros con nombre, autor, cantidad de páginas, etc.
Definir dominios y predicados para representar la posesión de distintos tipos de objetos por personas.
Definir dominios para representar en Prolog listas genéricas (o sea aquellas en las cuales cada elemento de la lista puede ser o bien átomo o bien una lista).
Definir un predicado para imprimir una lista del tipo definido anteriormente.
Definir un predicado para invertir una lista del tipo definido anteriormente, en todos sus niveles.
Definir un predicado para calcular la profundidad de una lista del tipo definido anteriormente.
Definir un predicado para planchar(colocar todos sus elementos atómicos en un solo nivel) una lista del tipo definido anteriormente.
% Ej 1 de la guía 4.
% Definir dominios para representar personas con nombre, apellido, edad, etc.
domains
apellido, nombre = symbol
edad = integer
persona = persona (nombre, apellido, edad)
% Ej 2 de la guía 4.
% Definir dominios para representar libros con nombre, autor, cantidad de páginas, etc.
domains
nombre_libro, autor = symbol
paginas = integer
libro = libro (nombre_libro, autor, paginas)
% Ej 4 de la guía 4.
% Definir dominios para representar en Prolog listas genéricas (o sea aquellas en las cuales cada elemento de la lista puede ser o bien átomo o bien una lista).
domains
elemento = int (integer); list (lista)
lista = elemento*
% Ej 5 de la guía 4.
% Definir un predicado para imprimir una lista del tipo definido anteriormente.
domains
elemento = int (integer); list (lista)
lista = elemento*
predicates
nondeterm imprimirLista (lista).
nondeterm imprimirEntero (integer).
clauses
imprimirEntero(Ca) :- write(Ca," ").
imprimirLista ([]).
imprimirLista([int(Ca)|Co]) :- imprimirEntero(Ca), imprimirLista(Co).
imprimirLista([list(Ca)|Co]) :- imprimirLista(Ca), imprimirLista(Co).
goal
imprimirLista([int(2),list([int(2),int(3)]),int(2),int(3),int(4)]).
% Ej 5 de la guía 4.
% Definir un predicado para imprimir una lista del tipo definido anteriormente.
domains
elemento = int (integer); list (lista)
lista = elemento*
predicates
nondeterm imprimir (lista).
clauses
imprimir([]).
imprimir([Ca|Co]) :- write(Ca), imprimir(Co).
goal
imprimir([int(2),list([int(2),int(3)]),int(2),int(3),int(4)]).
% Ej 7 de la guía 4.
% Definir un predicado para calcular la profundidad de una lista del tipo definido.
domains
entero = integer
elemento = int (entero); list (lista)
lista = elemento*
predicates
nondeterm profundidad(lista, entero).
clauses
profundidad([], Profundidad) :- Profundidad=0.
profundidad([int(_)|Co], Profundidad) :- ProfCa=1, profundidad(Co,ProfCo), ProfCa>ProfCo, Profundidad=ProfCa.
profundidad([int(_)|Co], Profundidad) :- ProfCa=1, profundidad(Co,ProfCo), ProfCa<=ProfCo, Profundidad=ProfCo.
profundidad([list(Ca)|Co], Profundidad) :- profundidad(Ca,ProfCa), profundidad(Co,ProfCo), ProfCo>=ProfCa+1, Profundidad=ProfCo.
profundidad([list(Ca)|Co], Profundidad) :- profundidad(Ca,ProfCa), profundidad(Co,ProfCo), ProfCo<=ProfCa, Profundidad=ProfCa+1.
goal
% Cero nivel de profundidad.
profundidad([], Profundidad0),
% Un nivel de profundidad.
profundidad([int(3)], Profundidad1),
% Dos niveles de profundidad.
profundidad([int(2),int(2),int(3),list([int(2),int(3)])], Profundidad2),
% Tres niveles de profundidad.
profundidad([list([int(2),int(3),list([int(2),int(3)])]),int(2),int(3),int(4)], Profundidad3),
% Cuatro niveles de profundidad.
profundidad([int(2),list([list([list([int(2),int(3)]),int(3)]),int(3)]),int(2),int(3),int(4)], Profundidad4),
write().
% Ej 8 de la guía 4.
% Definir un predicado para planchar (colocar todos sus elementos atómicos en un solo nivel) una lista del tipo definido anteriormente.
domains
entero = integer
elemento = int (entero); list (lista)
lista = elemento*
listaEntero = entero*
predicates
nondeterm insertar (listaEntero, entero, listaEntero).
nondeterm union (listaEntero, listaEntero, listaEntero).
nondeterm planchar(lista, listaEntero).
clauses
union(Lista,[], Union) :- Union=Lista, !.
union([],Lista, Union) :- Union=Lista, !.
union([Ca|Co],L2, Union) :- union(Co,L2,Union2), Union=[Ca|Union2].
insertar (Lista, Entero, [Entero| Lista]).
planchar([],[]).
planchar([int(Entero)|Co], Salida) :- planchar(Co,ColaPlanchada), insertar (ColaPlanchada, Entero, Salida).
planchar([list(Ca)|Co], Salida) :- planchar(Ca,SalidaCa), planchar(Co,SalidaCo), union(SalidaCa,SalidaCo,Salida).
goal
planchar([], Lista0),
planchar([int(3)], Lista1),
planchar([int(2),int(2),int(3),list([int(2),int(3)])], Lista2),
planchar([list([int(2),int(3),list([int(2),int(3)])]),int(2),int(3),int(4)], Lista3),
planchar([int(2),list([list([list([int(2),int(3)]),int(3)]),int(3)]),int(2),int(3),int(4)], Lista4),
write().