Guest User

ejercicios en Prolog

a guest
Jan 3rd, 2011
4,045
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 4.37 KB | None | 0 0
  1. % Serpiente Sumica
  2.  
  3. %Lista de digitos
  4. digito([1,2,3,4,5,6,7,8,9]).
  5. functor(j,4).
  6. %serpiente recibe 4 listas
  7. serpiente(j(L1,L2,L3,L4)):-digito(L),  retornarLista1(L,L1,Ls1), retornarLista(Ls1,L2,Ls2), retornarLista(Ls2,L3,Ls3),retornarLista(Ls3,L4,_).
  8. %Retorna una lista de 3 elementos que su sumatoria es 13 y los retorna en una lista
  9. retornarLista1(Aux,[A,B,C],[C|L3]):- member(A,Aux), delete(Aux,A,L1),member(B,L1), delete(L1,B,L2),member(C,L2), delete(L2,C,L3), 13 =:=  A + B + C.
  10. %Retorna una lista de 3 elementos conserbando el 1er elemento de la lista dada y la sumatoria de sus elementos es 13 y retorna la lista dada sin los elementos de las segunda  
  11. retornarLista(Aux,[A,B,C],[C|L3]):- delete(Aux,A,L1),member(B,L1), delete(L1,B,L2),member(C,L2), delete(L2,C,L3), 13 =:=  A + B + C.   
  12.        
  13.    
  14.  
  15.  
  16.  
  17.  
  18. % Ocho Numeros en Linea
  19.  
  20. % la lista devuelve los numeros del 1 al 8
  21. lista([1,2,3,4,5,6,7,8]).
  22.  
  23. % devuelve una lista con digitos del 1 al 8 de forma que la diferencia, en un orden o en otro, entre dos números vecinos, no sea nunca menor que 4
  24. ochoEnLineaA(V):-lista(L),quitarElem(L,E,Ls), ochoAuxA([E|Ls],[E|S]), retornarLista([E|S], V).
  25.  
  26. % se encarga de generar y verificar las condiciones de las listas
  27. ochoAuxA([X],[X]):-!.
  28. ochoAuxA([EL1|L1],[EL1|Resto]):- quitarElem([EL1|L1],EL1,Ls), quitarElem(Ls,EL2,Ls1), abs(EL1-EL2) >=4, ochoAuxA([EL2|Ls1],Resto).
  29.  
  30. % quita el elemento E de la lista L
  31. quitarElem(L,E,Ls):- member(E,L), delete(L,E,Ls).
  32.  
  33. % devuelve la lista pasada
  34. retornarLista([E|S],[E|S]).
  35.  
  36.  
  37.  
  38.  
  39.  
  40. % Rueda Numerica
  41.  
  42.  
  43. % devuleve listas con digitos del 1 al 9, de manera que todas las líneas de tres dígitos sumen el 15
  44. ruedaNumerica(L1, L2, L3, L4):- digitos(L), quitarElem(L, E, Ls), obtenerRueda(E, Ls, L1, L2, L3, L4).
  45.  
  46. % obtiene una rueda con el elemento E como centro
  47. obtenerRueda(E, L, L1, L2, L3, L4):- parteDeRueda(E, L, L1, Ls), parteDeRueda(E, Ls, L2, Ls1),
  48.                      parteDeRueda(E, Ls1, L3, Ls2), parteDeRueda(E, Ls2, L4, _).
  49.  
  50. % devuelve la lista que cumple la condición de que sume 15
  51. parteDeRueda(E, L, [El,E,Er], Resto):- quitarElem(L, El, Ls), quitarElem(Ls, Er, Resto), 15 is E + Er + El.
  52.  
  53.  
  54.  
  55.  
  56.  
  57. % Producto con Nueve Numeros
  58.  
  59.  
  60. % devuelve listas con digitos del 1 al 9, de manera que el producto resultante sea correcto
  61. productoNueveNumeros(Multiplicando, E, Result):- digitos(L), obtenerMultiplicando(L, Multiplicando, Ls),
  62.                          quitarElem(Ls, E, Resto), obtenerResult(Resto, Result),
  63.                          Result is Multiplicando * E.
  64.  
  65. % devuelve el multiplicando
  66. obtenerMultiplicando(L, Multiplicando, Resto):- quitarElem(L, E, Ls1), quitarElem(Ls1, E1, Ls2),
  67.                         quitarElem(Ls2, E2, Ls3), quitarElem(Ls3, E3, Resto),
  68.                         Multiplicando is E*1000 + E1*100 + E2*10 + E3.
  69.  
  70. % devuelve el resultado de la multiplicacion
  71. obtenerResult(L, Numero):- quitarElem(L, E, Ls1), quitarElem(Ls1, E1, Ls2),
  72.                quitarElem(Ls2, E2, Ls3), quitarElem(Ls3, E3, _),
  73.                Numero is E*1000 + E1*100 + E2*10 + E3.
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80. % Pares e Impares en una Suma
  81.  
  82.  
  83. % devuelve listas de digitos del 1 al 9, colocando los números pares en los cuadrados y los impares en los círculos del grafico del ejercicio
  84. sumaNueveNumeros(Result):- digitos(L), obtenerOperandoUno(L, Oper1,Ls),obtenerOperandoDos(Ls, Oper2,Ls2),
  85.                cuentaSuma(Ls2,Oper1, Oper2, Result),
  86.                write(Oper1 '+' Oper2 '=' Result).
  87.                
  88. % obtiene el primer operando
  89. obtenerOperandoUno(L,[E,E1,E2],Ls3):- quitarElem(L, E, Ls1),E mod 2 =\= 0,quitarElem(Ls1, E1, Ls2),E1 mod 2 =:= 0,
  90.                                       quitarElem(Ls2, E2, Ls3),E2 mod 2 =:= 0.
  91.  
  92. % obtiene el segundo operando                                      
  93. obtenerOperandoDos(L,[E,E1,E2],Ls):- quitarElem(L, E, Ls1),E mod 2 =\= 0,quitarElem(Ls1, E1, Ls2),E1 mod 2 =\= 0,
  94.                          quitarElem(Ls2, E2, Ls),E2 mod 2 =:= 0.
  95.  
  96. % realiza la suma
  97. cuentaSuma(Ls2,Oper1, Oper2, [R1,R2,R3]):- obtenerResultSum(Oper1,Num1),obtenerResultSum(Oper2,Num2),Result is Num1 + Num2,
  98.                            R1 is Result // 100 ,quitarElem(Ls2,R1,V), R1 mod 2 =\= 0, Raux is (Result - R1*100),
  99.                            R2 is  Raux // 10,quitarElem(V,R2,V2), R2 mod 2 =\= 0,
  100.                            R3 is (Result -  (R1*100 + R2*10)),
  101.                            quitarElem(V2,R3,_),R3 mod 2 =:= 0.
  102.  
  103. % obtiene el resultado de la suma
  104. obtenerResultSum(L, Numero):- quitarElem(L, E, Ls1), quitarElem(Ls1, E1, Ls2),
  105.                   quitarElem(Ls2, E2, _),
  106.                   Numero is E*100 + E1*10 + E2,!.
Advertisement
Add Comment
Please, Sign In to add comment