Advertisement
ganryu

Prologueando

Apr 21st, 2018
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 5.88 KB | None | 0 0
  1. % GUILLERMO DE JESÚS
  2. % SANTIAGO SANTANA
  3.  
  4. % PRÁCTICO 1
  5.  
  6. % EJERCICIO 1
  7. persona(alan).
  8. persona(pedro).
  9. persona(jose).
  10. persona(juan).
  11. persona(enrique).
  12. persona(carlos).
  13. persona(maria).
  14.  
  15. enfermedad(gripe).
  16. enfermedad(gastritis).
  17. enfermedad(neumonia).
  18.  
  19. persona_enfermedad(pedro,neumonia).
  20. persona_enfermedad(jose,gripe).
  21. persona_enfermedad(alan, gastritis).
  22. persona_enfermedad(juan,neumonia).
  23. persona_enfermedad(enrique,gripe).
  24. persona_enfermedad(carlos, gastritis).
  25. persona_enfermedad(maria, gastritis).
  26.  
  27. enfermedad_remedio(neumonia, azitromicina).
  28. enfermedad_remedio(gripe,paracetamol).
  29. enfermedad_remedio(gastritis,omeprazol).
  30.  
  31. % remedio efecto colateral:
  32. rec(azitromicina, dolor_cabeza).
  33. rec(paracetamol, dolor_cabeza).
  34. rec(omeprazol,mareos).
  35.  
  36. % EJERCICIO 2
  37. % factorial(N, R): R es el resultado de aplicar la operación factorial sobre N
  38. factorial(N, R) :- factorial(N, 1, R).
  39. factorial(0, R, R) :- !.
  40. factorial(N, A, R) :-
  41.     N1 is N - 1,
  42.     A1 is A * N,
  43.     factorial(N1, A1, R).
  44.  
  45. % fib(N, R): N es el ordinal de R en la secuencia de fibonacci
  46. fib(0, 1) :- !.
  47. fib(1, 1) :- !.
  48. fib(N, R) :-
  49.     N > 1,
  50.     A is N-1,
  51.     A2 is N-2,
  52.     fib(A, R1),
  53.     fib(A2, R2),
  54.     R is R1 + R2.
  55.  
  56. % ack(M, N, R): R es el resultado de aplicar la función de ackerman sobre los argumentos M y N
  57. ack(0, N, R) :- !, R is N + 1.
  58. ack(M, 0, R) :- !, M2 is M - 1, ack(M2, 1, R).
  59. ack(M, N, R) :-
  60.     M > 0,
  61.     N > 0,
  62.     !,
  63.     M2 is M - 1,
  64.     N2 is N - 1,
  65.     ack(M, N2, R2),
  66.     ack(M2, R2, R).
  67.  
  68. % EJERCICIO 3
  69. esMadre(M) :- madre(M, _).
  70.  
  71. hijo(Hijo, Padre) :- padre(Padre, Hijo), hombre(Hijo).
  72. hijo(Hijo, Madre) :- madre(Madre, Hijo), hombre(Hijo).
  73.  
  74. abuela(A, N) :- madre(A, M), madre(M, N), mujer(A).
  75. abuela(A, N) :- madre(A, P), madre(P, N), mujer(A).
  76.  
  77. hermanos(X, Y) :- madre(M, X), madre(M, Y), padre(P, X), padre(P, Y).
  78.  
  79. suegra(Suegra, Esposo) :- pareja-casada(Esposa, Esposo), madre(Suegra, Esposa).
  80. suegra(Suegra, Esposa) :- pareja-casada(Esposa, Esposo), madre(Suegra, Esposo).
  81.  
  82. nuera(Nuera, Suegra) :- pareja-casada(Nuera, Esposo), madre(Suegra, Esposo).
  83. nuera(Nuera, Suegro) :- pareja-casada(Nuera, Esposo), padre(Suegro, Esposo).
  84.  
  85. yerno(Yerno, Suegra) :- pareja-casada(Esposa, Yerno), madre(Suegra, Esposa).
  86. yerno(Yerno, Suegro) :- pareja-casada(Esposa, Yerno), padre(Suegro, Esposa).
  87.  
  88. padresPoliticos(X, Suegro, Suegra) :- suegra(Suegra, X), yerno(X, Suegro), Suegra =\= Suegro.
  89. padresPoliticos(X, Suegro, Suegra) :- suegra(Suegra, X), nuera(X, Suegro), Suegra =\= Suegro.
  90.  
  91. hermanoPolitico(Esposo, Y) :- pareja-casada(Esposa, Esposo), hermanos(Esposa, Y).
  92. hermanoPolitico(Esposa, Y) :- pareja-casada(Esposa, Esposo), hermanos(Esposo, Y).
  93.  
  94. concuñados(X, Y) :- pareja-casada(Esposa, Esposo), hermanos(Esposa, X), hermanos(Esposo, Y).
  95.  
  96. % EJERCICIO 4
  97.  
  98. % esLista(L): true si L es una lista.
  99. esLista([]).
  100. esLista([_|_]).
  101.  
  102. % concat(L1, L2, L3): L3 es la concatenación de L1 y L2
  103. concat([], L, L) :- !, esLista(L).
  104. concat([E|L1], L2, [E|L3]) :- concat(L1, L2, L3).
  105.  
  106. % crear-lista(E1, E2, L): Crea una lista L que contiene los elementos E1 y E2
  107. crear-lista(E1, E2, [E1|E2]).
  108.  
  109. % buscar(E, L): Devuelve si existe el elemento E en la lista L
  110. buscar(_, []) :- fail.
  111. buscar(E, [H|_]) :- E =:= H.
  112. buscar(E, [H|T]) :- E =\= H, buscar(E, T).
  113.  
  114. % invertir(L, R): Guarda en R la lista L invertida
  115. invertirLista(L, R) :- invertirLista(L, [], R).
  116. invertirLista([], L, L).
  117. invertirLista([H|T], Prev, R) :- invertirLista(T, [H|Prev], R).
  118.  
  119. % insertar(E, L, R): R contiene la lista L con el elemento E en su cabeza
  120. insertar(E, L, [E|L]).
  121.  
  122. % remover(E, L, LS): LS es la lista resultante de remover todos los elementos E en la lista L
  123. remover(E, [E|T], LSE) :- remover(E, T, LSE).
  124. remover(E, [H|T], [H|LSE]) :- E =\= H, remover(E, T, LSE).
  125. remover(_, L, L).
  126.  
  127. % remover2(E, L, LS): LS es la lista resultante de remover la primer ocurrencia del elemento E en la lista L
  128. remover2(E, [E|T], T).
  129. remover2(E, [H|T], [H|LSE]) :- E =\= H, remover2(E, T, LSE).
  130.  
  131. % cambiar(X, Y, L, LS): LS es la lista resultante de cambiar  la primer instancia del elemento X por el elemento Y en la lista L
  132. cambiar(X, Y, [X|T], [Y|T]).
  133. cambiar(X, Y, [H|T], [H|LS]) :- cambiar(X, Y, T, LS).
  134.  
  135. % cambiar(X, Y, L, LS): LS es la lista resultante de cambiar  la primer instancia del elemento X por el elemento Y en la lista L
  136. cambiar2(X, Y, [X|T], [Y|LS]) :- cambiar2(X, Y, T, LS).
  137. cambiar2(X, Y, [H|T], [H|LS]) :- cambiar2(X, Y, T, LS).
  138. cambiar2(_, _, L, L).
  139.  
  140. % palindromear(L, L2): L2 es el resultado de concatenar L con la inversa de L
  141. palindromear(L, R) :- invertirLista(L, I), concat(L, I, R).
  142.  
  143. % rotarIzq(L, R): Mueve el primer elemento de L al final
  144. rotarIzq([H|T], R) :- concat(T, [H], R).
  145.  
  146. % EJERCICIO 5
  147. distancia(V1, V2, D) :- arco(V1, V2, D), !.
  148.  
  149. distancia(V1, V2, D) :-
  150.     distancia(V1, VSig, D1),
  151.     arco(VSig, V2, D2),
  152.     D is D1 + D2,
  153.     !.
  154.  
  155. % EJERCICIO 6
  156.  
  157. % contar(C, L, L2, N): Retorna en N la cantidad de veces que el carácter C aparece en la cabeza de la lista. L2 contiene la lista sin los caracteres C que se encuentren en su cabeza
  158. contar(_, [], [], 0).
  159. contar(C, [C|T], L, Cont2) :- contar(C, T, L, Cont), Cont2 is Cont + 1.
  160. contar(_, L, L, 0).
  161.  
  162. % pertenece(L): Determina si la lista de carácteres L pertenece a la gramática G
  163. perteneceG(L) :-
  164.     contar(a, L, L1, ContA),
  165.     contar(b, L1, L2, ContB),
  166.     contar(c, L2, [], ContC),
  167.     ContC2 is ContA + ContB,
  168.     ContB > 0,
  169.     ContC2 =:= ContC.
  170.  
  171. % EJERCICIO 7
  172. % rotarDerecha(L, N, R): R es el resultado de rotar N veces a la derecha la lista L
  173. rotarDerecha(L, 1, R) :- rotarIzq(R, L).
  174. rotarDerecha(L, N, R) :- N1 is N - 1, rotarIzq(R2, L), rotarDerecha(R2, N1, R).
  175.  
  176. % rotarIzquierda(L, N, R): R es el resultado de rotar N veces a la izquierda la lista L
  177. rotarIzquierda(L, 1, R) :- rotarIzq(L, R).
  178. rotarIzquierda(L, N, R) :- N1 is N - 1, rotarIzq(L, R2), rotarIzquierda(R2, N1, R).
  179.  
  180. % EJERCICIO 8
  181. % prefijo(P, L) :- true si P es prefijo de L
  182. prefijo([], L).
  183. prefijo([X|Y], [X|Z]) :- prefijo(Y, Z).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement