/**********************************************************/
/* */
/* Inteligencia Artificial */
/* Universidad de Alicante */
/* */
/* LOGICA DE PRIMER ORDEN */
/* Prolog */
/* */
/* */
/* S.O. : MS-DOS (Windows) */
/* Interprete : SWI-Prolog */
/* Fichero : EJ10.PL */
/* */
/**********************************************************/
objetivo es correlacionar una serie de propiedades que cumplen
distintos elementos de nuestro Dominio (Universo del Discurso).
tener dos elementos distintos de un mismo Universo la misma
write('Se lanza con ?- iniciar.'),
nl,nl.
/*---- PROGRAMA PRINCIPAL ----*/
/* iniciar <- llamada inicial del programa */
iniciar :- write('Base de Conocimientos: '),
read(BC),
consult(BC),!,
nl,write('Base de Conocimientos '),write(BC),
write(' consultada'),nl,nl,
numeroPropiedades(N),
objetosUniverso(M),
iniciar(N,M).
iniciar :- nl,write('ERROR: Base de Conocimientos no encontrada'),nl.
iniciar(2,M) :- !,ini(M,[],[]).
iniciar(3,M) :- !,ini(M,[],[],[]).
iniciar(4,M) :- !,ini(M,[],[],[],[]).
iniciar(5,M) :- !,ini(M,[],[],[],[],[]).
write(N),nl.
/* ini(Sol1,Sol2,...) <- Sol1 es una lista con los objetos del dominio 1,
Sol2 la lista con los objetos del dominio 2, ...
con las soluciones respectivamente relacionadas. */
/* Correlacionar 2 propiedades */
ini(M,L1,L2) :- nel(L1,M),escribir(L1,L2),nl,pausa,fail.
ini(M,L1,L2) :- r1(Obj1,Obj2),
nopertenece(Obj1,L1),
nopertenece(Obj2,L2),
ini(M,[Obj1|L1],[Obj2|L2]).
/* Correlacionar 3 propiedades */
ini(M,L1,L2,L3) :- nel(L1,M),escribir(L1,L2,L3),nl,pausa,fail.
ini(M,L1,L2,L3) :- r1(Obj1,Obj2),
nopertenece(Obj1,L1),
nopertenece(Obj2,L2),
r2(Obj1,Obj3),
nopertenece(Obj3,L3),
r3(Obj2,Obj3),
ini(M,[Obj1|L1],[Obj2|L2],[Obj3|L3]).
/* Correlacionar 4 propiedades */
ini(M,L1,L2,L3,L4) :- nel(L1,M),escribir(L1,L2,L3,L4),nl,pausa,fail.
ini(M,L1,L2,L3,L4) :- r1(Obj1,Obj2),
nopertenece(Obj1,L1),
nopertenece(Obj2,L2),
r2(Obj1,Obj3),
nopertenece(Obj3,L3),
r3(Obj1,Obj4),
nopertenece(Obj4,L4),
r4(Obj2,Obj3),
r5(Obj2,Obj4),
r6(Obj3,Obj4),
ini(M,[Obj1|L1],[Obj2|L2],[Obj3|L3],[Obj4|L4]).
/* Correlacionar 5 propiedades */
ini(M,L1,L2,L3,L4,L5) :- nel(L1,M),escribir(L1,L2,L3,L4,L5),nl,pausa,fail.
ini(M,L1,L2,L3,L4,L5) :- r1(Obj1,Obj2),
nopertenece(Obj1,L1),
nopertenece(Obj2,L2),
r2(Obj1,Obj3),
nopertenece(Obj3,L3),
r3(Obj1,Obj4),
nopertenece(Obj4,L4),
r4(Obj1,Obj5),
nopertenece(Obj5,L5),
r5(Obj2,Obj3),
r6(Obj2,Obj4),
r7(Obj2,Obj5),
r8(Obj3,Obj4),
r9(Obj3,Obj5),
r10(Obj4,Obj5),
ini(M,[Obj1|L1],[Obj2|L2],[Obj3|L3],[Obj4|L4],[Obj5|L5]).
/*---- RUTINAS GENERALES ----*/
/* escribir(Lista1,Lista2,...) <- escribe las soluciones correlacionadas
de las listas: Lista1, Lista2 ... */
escribir([],[]).
escribir([Obj1|Resto1],[Obj2|Resto2]) :-
write(Obj1), write(' - '),write(Obj2),nl,
escribir(Resto1,Resto2).
escribir([],[],[]).
escribir([Obj1|Resto1],[Obj2|Resto2],[Obj3|Resto3]) :-
write(Obj1), write(' - '),write(Obj2),
write(' - '), write(Obj3),nl,
escribir(Resto1,Resto2,Resto3).
escribir([],[],[],[]).
escribir([Obj1|Resto1],[Obj2|Resto2],[Obj3|Resto3],[Obj4|Resto4]) :-
write(Obj1), write(' - '),write(Obj2),
write(' - '), write(Obj3),write(' - '),write(Obj4),nl,
escribir(Resto1,Resto2,Resto3,Resto4).
escribir([],[],[],[],[]).
escribir([Obj1|Resto1],[Obj2|Resto2],[Obj3|Resto3],[Obj4|Resto4],[Obj5|Resto5]) :-
write(Obj1), write(' - '),write(Obj2),write(' - '),
write(Obj3),write(' - '),write(Obj4),write(' - '),
write(Obj5),nl,
escribir(Resto1,Resto2,Resto3,Resto4,Resto5).
pausa :- write('Pulsa <return> para buscar otra solucion'),
skip(10),nl.
/*---- RUTINAS DE MANEJO DE LISTAS ----*/
/* nopertenece(Elem,Lista)) <- el elemento Elem no pertenece a la lista Lista */
nopertenece(_,[]).
nopertenece(E,[X|L]) :- E\=X,
nopertenece(E,L).
nel([],0).
nel([_|L],N) :- nel(L,M),
N is M+1.
:- mensaje.