zoo.pro



% ALMACENA CONOCIMIENTO DE ANIMALES (Josue Espinosa Romero)
pide_atributos(Animal):-
	write('Atributo? (atributo.): '), read(ATRIB),
	ATRIB \= fin,
	atributos(Animal, L_ATRIB),
	append(L_ATRIB, [ATRIB], L2_ATRIB),
	retract(atributos(Animal, L_ATRIB)),
	assert(atributos(Animal, L2_ATRIB)),
	pide_atributos(Animal).
pide_atributos(_):-!.

muestra_lista([]).
muestra_lista([Head|Tail]):- write(Head), nl, muestra_lista(Tail).

muestra_atributos(Animal):- atributos(Animal, ATRIB), muestra_lista(ATRIB).

existe(Animal):- animal(Animal).

verifica(Animal):- existe(Animal), muestra_atributos(Animal).
verifica(Animal):- assert(animal(Animal)), assert(atributos(Animal, [])), pide_atributos(Animal).

miembro(X,[X|_]).
miembro(X,[_|Y]) :- miembro(X,Y).

subconjunto([X|Y],Z) :- miembro(X,Z), subconjunto(Y,Z).
subconjunto([],_).

obtenA([X|_], Y):- Y = X.

filtra(_, [], LA, LA):-!.
filtra(LC, [H|T], Aux, LA):- subconjunto(LC, H), obtenA(H, A), filtra(LC, T, [A|Aux], LA).
filtra(LC, [_|T], Aux, LA):- filtra(LC, T, Aux, LA).

carctede(A, [A|LC]):- setof(A, atributos(A, LC), _).

creaL([], L, L):-!.
creaL([H|T], L, LC):- carctede(H, LH), creaL(T, [LH|L], LC).

estan(L):- setof(X, animal(X), ListA), creaL(ListA, [],  L).

filtraAnimales(LC, LA):- estan(LAC), filtra(LC, LAC, [], LA).

obtenListaCaracteristicas(X, N, L):- N2 is N + 1, write(N2),write('? '),read(Y), ((Y \= fin, obtenListaCaracteristicas([Y|X], N2, L));fail).
obtenListaCaracteristicas(L, _, L):-!.

nuevoA(LC):-
	write('No conosco ningun animal con esas caracteristicas. Me podrias indicar cual es? '), read(A),
	assert(animal(A)), assert(atributos(A, LC)).
	

lee(animal):- write('Tipo de animal: '), read(Animal), Animal \= fin, verifica(Animal), lee(animal).
lee(caracteristicas):- 
	writeln('Ingresa una serie de caracteristicas del animal(fin. para terminar): '),
	obtenListaCaracteristicas([], 0, LC),
	filtraAnimales(LC, LA),
	((LA \= [], write('Los animales que tienen esas caracteristicas son: '), writeln(LA)); nuevoA(LC)).

	%muestra_lista(LA).
lee(_).

guarda:- animal(Animal), atributos(Animal, Atrib), write(Animal),write('.'), nl, write(Atrib), write('.'), nl, fail.
guarda:-!.
guarda(Archivo):- tell(Archivo), guarda, told.

carga(Animal, Atrib):- assert(animal(Animal)), assert(atributos(Animal, Atrib)), carga.
carga:- read(Animal), Animal \== end_of_file, read(Atrib), carga(Animal, Atrib).
carga:-!.
carga(Archivo):- see(Archivo), carga, seen.

ciclo:- write('Introduce tipo de informacion (animal., caracteristicas., fin.): '),  read(Tipo), ((Tipo \= fin, lee(Tipo), ciclo) ; fail).
ciclo.

%limpiaDatos:- animal(X), retract(animal(X)), fail.
%limpiaDatos:- atributos(X,Y), retract(atributos(X,Y)), fail.
%limpiaDatos:-!.
limpiaDatos:- retractall(animal(X)), retractall(atributos(X,_)).

%inicio(Archivo):- assert(animal(p)), assert(atributos(p, [])), limpiaDatos, carga(Archivo), ciclo, guarda(Archivo), !.
inicio:- limpiaDatos, carga('zoo.txt'), ciclo, guarda('zoo.txt'), !.

:- dynamic animal/1, atributos/2.