PROLOG
PROLOG
oe
ESCUELA PROFESIONAL:
INGENIERA DE SISTEMAS
CURSO:
INTELIGENCIA ARTIFICIAL
DOCENTE:
ING. GAVINO LOYAGA
ALUMNO:
-GUEVARA MATAS LUIS
2013
5
i = 1..n (.)
Xs = [7,9,8]
cambia(Xs,Ys) :-
sumatorio(Xs,S),
acumula(Xs,S,Ys).
sumatorio([],0).
sumatorio([X|Xs],S) :sumatorio(Xs,Ss),
S is X + Ss.
acumula([],_S,[]).
acumula([X|Xs],S,[A|As]):A is X + S,
acumula(Xs,S,As).
valor(N1,S1),
N2 is N - 2,
valor(N2,S2),
S is S1 + S2.
sucesion(0,[0]).
sucesion(N,S) :N > 0,!,
N1 is N - 1,
sucesion(N1,S1),
valor(N,V),
concat(S1,[V],S).
10
long(NDs,L).
a(X,Y):-b(X,Y).
a(X,Y):-c(X,Y).
b(X,Y):-d(X),!,e(X,Y).
b(X,Y):-f(X,Y).
c(1,2). c(1,3).
d(1). d(2).
e(2,3).
f(3,4). f(3,5).
/*
RESPUESTAS:
?- a(1,X).
X = 2 ;
12
X = 3.
?- a(2,X).
X = 3 ;
false.
?- a(3,X).
X = 4 ;
X = 5 ;
false.
Ejemplo:
? rep([1,4,6],V).
V = 146
rep(X,N) :- inversa(X,Xi),
repAux(Xi,N).
repAux([],0).
repAux([X],X) :- !.
14
repAux([X|Xs],N) :- !,
repAux(Xs,Ns),
N is Ns*10 + X.
15
yes
monte(Xs) :concat(As,Bs,Xs),
creciente(As),
decreciente(Bs).
creciente([]).
creciente([_X]).
creciente([X,Y|Zs]) :- X =< Y,
creciente([Y|Zs]).
decreciente([]).
16
decreciente([_X]).
decreciente([X,Y|Zs]) :- Y =< X,
decreciente([Y|Zs]).
monteRes(Xs,[As,Bs]) :concat(As,Bs,Xs),
creciente(As),
decreciente(Bs).
%% Interesante
% ?- monteRes([1,3,5,6,4,3,0],P).
% P = [[1, 3, 5], [6, 4, 3, 0]] ;
% P = [[1, 3, 5, 6], [4, 3, 0]] ;
17
%
%
%
%
%
%
%
%
%
%
%
%
%
false.
?- monteRes([1,2,3,4],P).
P = [[1, 2, 3], [4]] ;
P = [[1, 2, 3, 4], []] ;
false.
?- monteRes([2,1,3],P).
false.
Modificar el modelo anterior de forma que la sucesin tenga
una parte creciente, un pico y una parte descendiente.
La parte correspondiente al pico debe no ser vaca y ser
estrictamente mayor que las partes creciente y decreciente.
18
%
montana(Xs,[Cr,Pico,Dr]) :concat(CrPico,Dr,Xs),
concat(Cr,Pico,CrPico),
creciente(Cr),
nivelada(Pico),
decreciente(Dr),
menores(Cr,Pico),
menores(Dr,Pico).
menores([],_).
menores([X|Xs],[P|Ps]) :- X < P,
menores(Xs,[P|Ps]).
19
nivelada([_X]).
nivelada([X,X|Xs]) :- nivelada([X|Xs]).
% ?- montana([1,2,2,3,3,3,1,0],R).
% R = [[1, 2, 2], [3, 3, 3], [1, 0]] ;
% false.
%
20
21
cambio(N1,Xs).
cambio(N,[25|Xs]) :N >= 25,!,
N1 is N - 25,
cambio(N1,Xs).
cambio(N,[5|Xs]) :N >= 5,!,
N1 is N - 5,
cambio(N1,Xs).
cambio(N,[1|Xs]) :N >= 1,!,
N1 is N - 1,
cambio(N1,Xs).
22
23
/* longitud de una lista */
lenght([],0).
lenght([_|L],T):lenght(L,T1),
T isT1+1.
/* adicionar un elemento de la cabeza de una lista */
addhead(X, L, [X|L]).
/* borrar la cabeza de una lista*/
deletehead(L,L1):addhead(_,L1,L).
/* adicionar al final de una lista */
24
25
insert(X,0,L1,[X|L1]).
insert(X,Pos,[C|R],[C|R2]):Pos1is Pos-1,
insert(X,Pos1,R,R2).
/* devuelve las posiciones en que se encuentra un elemento X*/
pos(X,[X|_],0).
pos(_,[],_):!,fail.
pos(X,[_|R],Pos):pos(X,R,Pos1),
Pos isPos1+1.
26
/* clonar lista*/
clonlist([], []).
clonlist([C|R], [C|R1]):clonlist(R, R1).
/* elemento X de una Lista*/
getElem(0,[C|_],C):-!.
getElem(X,[_|R],Sol):X1is X -1,
getElem(X1,R,Sol)
.
/* existencia de un elemento en una lista */
existe(_,[]):-fail.
27
existe(X,[X|_]):-!.
existe(X,[_|R]):existe(X,R).
/* elminar un elemento de la lista */
eliminar(_,[],[]):-fail.
eliminar(X,[X|R],R).
eliminar(X,[C|R],[C|R1]):eliminar(X,R,R1)
.
/* subconjuntos de una lista */
subconjunto([],[]).
28
subconjunto([C|R],[C|R1]):subconjunto(R,R1).
subconjunto(L,[_|R1]):subconjunto(L,R1).
/* permutaciones de una lista*/
permutaciones([],[]).
permutaciones([C1|R1],L):eliminar(C1,L,Rest),
permutaciones(R1,Rest).
/* laboratorio */
vacia([]).
29
subcPerm(L,L1):subconjunto(T,L1),
permutaciones(L,T)
.
check([],[],A,A).
check([C|R],[+C|R1],SumaTemp,Suma):M is SumaTemp + C,
check(R,R1,M,Suma)
.
check([C|R],[-C|R1],SumaTemp,Suma):M is SumaTemp - C,
30
check(R,R1,M,Suma)
.
lab(ListaLarga,Suma,[C|R1]):subcPerm([C|R],ListaLarga),
check(R,R1,C,Suma)
.
/* invertir una lista*/
invertir([],[]).
invertir([C|R],L):invertir(R,X),
addend(C,X,L).
31
32
menor([C|R],C1):menor(R,C2),
C<C2 ,
C1is C,!.
menor([_|R],C1):menor(R,C1)
.
/* sublistas de una lista*/
prim([],_).
prim([C|R],[C|R1]):prim(R,R1)
.
33
sublista([],[]).
sublista([C|R],[C1|R1]):prim([C|R],[C1|R1]);
sublista([C|R],R1)
.
/* verifica si una lista es creciente*/
creciente([_|[]]).
creciente([C|[C1|R1]]):C <C1,
creciente([C1|R1])
.
34
35
may(Inter,L,M)
.
/* producto de 2 vectores */
prodEscalar([],[],0).
prodEscalar([C|R],[C1|R1],Result):prodEscalar(R,R1,Result1),
Result is C * C1 + Result1
.
/* cantidadcolumnas de unamatriz */
cantCol([C|_],CC):lenght(C,CC)
.
36
37
getElem(Num,L,L1)
.
/* multiplicar matrices */
crearFila(_,Col,[],_,M2):cantCol(M2,Cant), Cant= Col,!
.
crearFila(Fil,Col,[C|R],M1,M2):getFil(M1,Fil,Fila),
getCol(M2,Col,Columna),
prodEscalar(Fila,Columna,C),
ColTempis Col +1, crearFila(Fil,ColTemp,R,M1,M2)
38
.
mult(Fil,[],M1,_):cantFil(M1,Cant),Cant= Fil,
!.
mult(Fil,[C|R],M1,M2):crearFila(Fil,0,C,M1,M2),
FilTemp is Fil +1,
mult(FilTemp,R,M1,M2)
.
multiplicar(M1,M2,M):mult(0,M,M1,M2)
39
.
/* cantidad que se repite X en una lista*/
cantRep(_,[],0).
cantRep(X,[X|R],Cant):cantRep(X,R,Cant1),
Cant is Cant1+1,!.
cantRep(X,[_|R],Cant):cantRep(X,R,Cant)
.
/* jkkjhk no pincha */
40
mayr([X],1,X).
mayr([C|R],Cant,Elem):cantRep(C,[C|R],Cant1),
mayr(R,Cant2,Elem1),
(((Cant1>= Cant2) ,(Cant is Cant1,Elem is C)) ;( Cant is Cant2 , Elem is Elem1))
.
/* concatenar dos listas */
concat([],L,L).
concat([C|R],L,[C|R1]):concat(R,L,R1)
.
41
/* obtener todos los elementos atomicos de una lista de listas de listas de... */
flatten([],[]):-!.
flatten([C|R],L):flatten(C,L1),
flatten(R,L2),
concat(L1,L2,L),!
.
flatten(X,[X]).
/* suma de matrices */
crearfila([],[],[]).
crearfila([C|R],[C1|R1],[C2|R2]):-
42
C2 is C + C1,
crearfila(R,R1,R2)
.
sumaMat([],[],[]).
sumaMat([C|R],[C1|R1],[C2|R2]):crearfila(C,C1,C2),
sumaMat(R,R1,R2)
.
/* elemento de unamatriz */
elemMat(Fila,Col,[C|R],X):getElem(Fila,[C|R],L),
getElem(Col,L,X)
.
43
44
sobreescribirMat(_,_,_,[],[]):-!.
sobreescribirMat(0,Col,Elem,[C|R],[C1|R1]):sobreescribirEn(Elem,Col,C,C1), FilTempis -1,
sobreescribirMat(FilTemp,Col,Elem,R,R1),!
.
sobreescribirMat(Fil,Col,Elem,[C|R],[C|R1]):FilTempis Fil - 1,
sobreescribirMat(FilTemp,Col,Elem,R,R1)
.
/* intercambiar elemntos de una matriz */
exchange(pto(Fila1,Col1),pto(Fila2,Col2),[C|R],[C1|R1]):elemMat(Fila1,Col1,[C|R],Pos1),
45
elemMat(Fila2,Col2,[C|R],Pos2),
sobreescribirMat(Fila1,Col1,Pos2,[C|R],M),
sobreescribirMat(Fila2,Col2,Pos1,M,[C1|R1])
.
46
prim3([C|R],[C1|R1]);
sublista3([C|R],R1)
pertenece(X,[X|_]).pertenece(X,[_|Cola]) :- pertenece(X,Cola).
conc([],L,L).conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
anadir(X,L,[X|L]).
quitar(X,[X|Cola],Cola).quitar(X,[_|Cola],[X|L]) :- quitar(X,Cola,L).
insertar(X,L,[X|L]).insertar(X,[Y|L1],[Y|L2]) :- insertar(X,L1,L2).
sublist(S,L) :- conc(L1,L2,L),
permutacion([],[]).permutacion([X|L],P) :- permutacion(L,P1),
conc(S,L3,L2).
47
48