/**********************************************************/ /* */ /* 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.