% correr el programa con start.
animales([perro]).
datos([[ladra, peludo]]).
start:-
animales(LAnim), datos(LDatos),
inicia(LAnim, LDatos).
inicia(LAnim, LDatos):-
write('Introduce el nombre de un animal: '),
readln(AnimalNuevo),
procesa(LAnim, LDatos, AnimalNuevo, LANew, LDNew), !,
inicia(LANew, LDNew).
inicia(_, _):-!.
procesa(_, _, [fin], [], []):- !, fail.
procesa(LAnim, LDatos, [AnimNew], LAnim, LDatos):-
existe(LAnim, LDatos, AnimNew, Datos),
muestra(Datos).
procesa(LA, LD, [Animal], LANew, LDNew):-
unir(LA, [Animal], LANew),
pideDatos([], LDatos),
unir(LD, [LDatos], LDNew), !.
pideDatos(Li, Lf):-
write('Introduce un dato: '),
readln(Dato),
noEsFin(Dato),
unir(Li, Dato, LNew), !,
pideDatos(LNew, Lf).
pideDatos(Lista, Lista):-!.
noEsFin([fin]):- !, fail.
noEsFin(_):- !.
%No existe y pide datos
existe([], _, _, []):- !, fail.
%Si estA
existe([Animal|_], [Datos|_], Animal, Datos):-!.
%Sigue buscando
existe([_|LA], [_|LD], Animal, Datos):-
!, existe(LA, LD, Animal, Datos).
muestra([]):-!.
muestra([Head|Tail]):-
writeln(Head), !, muestra(Tail).
unir(Lista, [Elem], [Elem|Lista]):-!.