Práctica Nro: 4 (Functores) [Foros-FIUBA::Wiki]
 

Práctica Nro: 4 (Functores)

Enunciados

  1. Definir dominios para representar personas con nombre, apellido, edad, etc.
  2. Definir dominios para representar libros con nombre, autor, cantidad de páginas, etc.
  3. Definir dominios y predicados para representar la posesión de distintos tipos de objetos por personas.
  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).
  5. Definir un predicado para imprimir una lista del tipo definido anteriormente.
  6. Definir un predicado para invertir una lista del tipo definido anteriormente, en todos sus niveles.
  7. Definir un predicado para calcular la profundidad de una lista del tipo definido anteriormente.
  8. Definir un predicado para planchar(colocar todos sus elementos atómicos en un solo nivel) una lista del tipo definido anteriormente.

Resueltos

Ej 1

% 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

% 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

% 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

% 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 (otra forma)

% 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

% 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

% 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().
materias/75/23/guia_4.txt · Última modificación: 2007/11/16 11:41 por gsoriano
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki