Guest User

Untitled

a guest
Jul 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.82 KB | None | 0 0
  1.  
  2. % Informacion para los casos de prueba
  3. % ====================================
  4. %
  5.  
  6. % Definiciones de bloques:
  7. bloque(bloque1, 3, 4, rojo).
  8. bloque(bloque2, 2, 2, verde).
  9. bloque(bloque3, 1, 0, amarillo).
  10. bloque(bloque4, 2, 0, azul).
  11. bloque(cuboGrande, 3, 3, rojo).
  12. bloque(cuboMediano, 2, 2, azul).
  13. bloque(cuboChico, 1, 1, rojo).
  14. bloque(piramide, 2, 0, verde).
  15.  
  16. % Estados de prueba:
  17. estado0([sobre(piso, cuboGrande), sobre(piso, piramide),
  18. sobre(piso, cuboMediano), sobre(cuboMediano, cuboChico)]).
  19. estado1([sobre(piso, bloque1), sobre(piso, bloque2), sobre(bloque2, bloque3)]).
  20. estado1dups([sobre(piso, bloque1), sobre(piso, bloque2),
  21. sobre(bloque2, bloque3), sobre(piso, bloque1)]).
  22. estado2([sobre(piso, cuboGrande), sobre(cuboGrande, cuboMediano),
  23. sobre(cuboGrande, cuboChico)]).
  24. estado3([sobre(piso, cuboGrande), sobre(piso, cuboMediano),
  25. sobre(cuboGrande, cuboMediano)]).
  26. estado4([sobre(cuboGrande, cuboMediano), sobre(cuboMediano, cuboChico)]).
  27. estado5([sobre(piso, cuboGrande), sobre(cuboGrande, cuboMediano),
  28. sobre(cuboGrande, piramide)]).
  29. estado6([sobre(cuboGrande, cuboGrande)]).
  30. estado7([sobre(piso , cuboGrande), sobre(cuboGrande, cuboChico),
  31. sobre(cuboGrande, piramide)]).
  32. estado8([sobre(piso, bloque1), sobre(bloque2, bloque3)]).
  33.  
  34. estado10([sobre(piso , cuboGrande) ,sobre(piso , cuboMediano) ,sobre(cuboMediano, cuboChico)]).
  35.  
  36.  
  37. % Ejercicio 1: Solucion
  38. % =====================
  39.  
  40. % bloques(+Estado, -Bloques)
  41. % Predicado que es verdadero si y solo si Bloques es una lista sin
  42. % repetidos de todos los bloques que figuran en el estado Estado, sin
  43. % incluir el piso.
  44. % Para verificarlo:
  45. % * se consigue una lista de todos los componentes (bloques y piso) del
  46. % estado usando el predicado componentes/2,
  47. % * se quitan los duplicados de dicha lista mediante quitarDuplicados/2,
  48. % * se eliminan las ocurrencias del piso en la lista a traves
  49. % de quitarPiso/2
  50. % * se corrobora que Bloques sea una permutacion de la lista obtenida.
  51. % La implementacion permite obtener un valor para Bloques dado un estado
  52. % especifico.
  53. bloques(Estado, Bloques) :- componentes(Estado, Componentes),
  54. quitarDuplicados(Componentes, ComponentesSinDuplicados),
  55. quitarPiso(ComponentesSinDuplicados, PosibleBloquesResultado),
  56. permutation(PosibleBloquesResultado, Bloques), !.
  57.  
  58. % componentes(+Estado, -Componentes)
  59. % Predicado que es verdadero si y solo si Componentes es una lista
  60. % generada reemplazando cada elemento sobre(X, Y) de Estado por dos
  61. % elementos X e Y.
  62. componentes([], []).
  63. componentes([sobre(X, Y)|Ss], [X, Y|Es]) :- componentes(Ss, Es).
  64.  
  65. % quitarDuplicados(+L1, -L2)
  66. % Predicado que es verdadero si y solo si L2 es el resultado de aplicar
  67. % el siguiente procedimiento:
  68. % 1. Para cada elemento E de L1:
  69. % 2. si E se encuentra luego en la lista, quitar la ocurrencia actual
  70. % Se podria implementar este predicado, aunque requiriendo que L2 se
  71. % encuentre ordenada, del siguiente modo:
  72. % quitarDuplicados(L1, L2) :- setof(X, member(X, L1), L2).
  73. % O, sin esa restriccion, como sigue:
  74. % quitarDuplicados(L1, L2) :- list_to_set(L1, L2).
  75. quitarDuplicados([], []).
  76. quitarDuplicados([X|Xs], Ys) :- member(X, Xs), quitarDuplicados(Xs, Ys).
  77. quitarDuplicados([X|Xs], [X|Ys]) :- not(member(X,Xs)), quitarDuplicados(Xs, Ys).
  78.  
  79. % quitarPiso(+L1, -L2)
  80. % Predicado que es verdadero si y solo si L2 es el resultado de aplicar
  81. % el siguiente procedimiento:
  82. % 1. Para cada elemento E de L1:
  83. % 2. si E unifica con piso, quitar la ocurrencia actual
  84. % Este predicado podria implementarse como:
  85. % quitarPiso(L1, L2) :- delete(L1, piso, L2).
  86. quitarPiso([], []).
  87. quitarPiso([X|Xs], Ys) :- X = piso, quitarPiso(Xs, Ys).
  88. quitarPiso([X|Xs], [X|Ys]) :- X \= piso, quitarPiso(Xs, Ys).
  89.  
  90. % Ejercicio 1: Test cases
  91. % =======================
  92. % estado1(E), bloques(E, X).
  93.  
  94.  
  95. % Ejercicio 2: Solucion
  96. % =====================
  97.  
  98. % baseDe(+Estado, -A, -B)
  99. % Predicado que es verdadero si y solo si, en el estado Estado, el
  100. % bloque B esta apoyado sobre la superficie A.
  101. % Simplemente se verifica si sobre(A, B) es un elemento de Estado.
  102. baseDe(Estado, A, B) :- member(sobre(A, B), Estado).
  103.  
  104. % Ejercicio 2: Test cases
  105. % =======================
  106. % estado1(E), baseDe(E, X, bloque2).
  107. % estado1(E), baseDe(E, X, Y).
  108.  
  109.  
  110. % Ejercicio 3: Solucion
  111. % =====================
  112.  
  113. % apoyadosSobre(+Estado, +A, -Bs)
  114. % Predicado que es verdadero si y solo si, en el estado Estado, la
  115. % lista Bs contiene (sin repetir) a todos los bloques apoyados sobre
  116. % A.
  117. % Para verificarlo, se obtienen, utilizando baseDe/3, todos los bloques
  118. % apoyados sobre A y, mediante el predicado setof/3 se instancia una
  119. % lista sin repetidos con todos ellos. Luego, se verifica que Bs sea una
  120. % permutacion de la lista obtenida.
  121. % La implementacion permite obtener un valor para Bs dados un Estado y
  122. % un componente A.
  123. apoyadosSobre(Estado, A, Bs) :- findall(X, baseDe(Estado, A, X), BsConDups),
  124. quitarDuplicados(BsConDups, PosibleBs), permutation(PosibleBs, Bs), !.
  125.  
  126.  
  127. % Ejercicio 3: Test cases
  128. % =======================
  129. % estado1(E), apoyadosSobre(E, piso, Bs).
  130. % estado1(E), apoyadosSobre(E, bloque1, Bs).
  131. % estado1(E), apoyadosSobre(E, bloque2, Bs).
  132. % estado1(E), apoyadosSobre(E, bloque1, []).
  133. % estado1dups(E), apoyadosSobre(E, piso, Bs).
  134.  
  135. % Ejercicio 4: Solucion
  136. % =====================
  137.  
  138. %% falta q Brian nos confirme si tiene q fallar cuando la entrada posee duplicados
  139. valido(Estado) :- quitarDuplicados(Estado,Estado), forall(member(X, Estado), X \= sobre(_, piso)),
  140. bloques(Estado, Bloques),
  141. forall(member(Bloque, Bloques), tieneUnaSolaBase(Estado, Bloque)),
  142. forall(member(Bloque, Bloques), tieneTechoSuficiente(Estado, Bloque)),
  143. forall(member(Bloque, Bloques), not(esParteDeUnCiclo(Estado, Bloque))).
  144.  
  145. tieneUnaSolaBase(Estado, Bloque) :- numeroDeBases(Estado, Bloque, 1).
  146.  
  147. numeroDeBases(Estado, Bloque, N) :- setof(X, baseDe(Estado, X, Bloque), Bases),
  148. length(Bases, N).
  149.  
  150. tieneTechoSuficiente(Estado, Bloque) :-
  151. apoyadosSobre(Estado, Bloque, Apoyados),
  152. sumaBases(Apoyados, SumaBasesApoyados),
  153. areaTechoDe(Bloque, AreaTecho),
  154. SumaBasesApoyados =< AreaTecho.
  155.  
  156. sumaBases(Bloques, SumaBases) :-
  157. maplist(areaBaseDe, Bloques, AreasBase),
  158. sumlist(AreasBase, SumaBases).
  159.  
  160. areaBaseDe(Bloque, AreaBase) :- bloque(Bloque, AreaBase, _, _).
  161.  
  162. areaTechoDe(Bloque, AreaTecho) :- bloque(Bloque, _, AreaTecho, _).
  163.  
  164. esParteDeUnCiclo(Estado, Bloque) :- baseDe(Estado, Base, Bloque),
  165. cicloEncontrado(Estado, Base, Bloque), !.
  166.  
  167. cicloEncontrado(_, Bloque, Bloque).
  168. cicloEncontrado(Estado, Bloque, BloqueInicial) :- baseDe(Estado, Base, Bloque),
  169. cicloEncontrado(Estado, Base, BloqueInicial).
  170.  
  171. % Ejercicio 4: Test cases
  172. % =======================
  173. % estado2(E), valido(E). % (true)
  174. % estado3(E), valido(E). % (false)
  175. % estado4(E), valido(E). % (false)
  176. % estado5(E), valido(E). % (false)
  177. % estado6(E), valido(E). % (false)
  178.  
  179.  
  180. % Ejercicio 5: Solucion
  181. % =====================
  182.  
  183. % bloqueMovil(+Estado, -Bloque)
  184. % Predicado que es verdadero sii el bloque es móvil, o sea, si no hay
  185. % ningun bloque apoyado sobre el.
  186. % Para determinar esto, vemos primero que el bloque este en el estado, y
  187. % luego vemos que no sea un bloque que sirva de base a otros.
  188. bloqueMovil(E, B) :- bloques(E, Bs), member(B, Bs), apoyadosSobre(E,B,[]).
  189.  
  190. % Ejercicio 5: Test cases
  191. % =======================
  192. % estado1(E), bloqueMovil(E, B).
  193.  
  194.  
  195. % Ejercicio 6: Solucion
  196. % =====================
  197.  
  198. % movimientoPosible(+Estado, -Movimiento)
  199. % Predicado que es verdadero sii Movimiento es un movimiento posible en el
  200. % estado Estado de la forma apoyarSobre(A, B).
  201. % Para determinar esto, vemos si A es tope (puede ser el piso o un bloque
  202. % de Estado), si B es un bloque de Estado y es movil, y que A y B sean
  203. % distintos.
  204. movimientoPosible(E, apoyarSobre(A, B)) :-
  205. bloques(E, Bs),
  206. member(B, Bs), bloqueMovil(E, B),
  207. A \= B,
  208. not(baseDe(E, A, B)).
  209.  
  210. % Ejercicio 6: Test cases
  211. % =======================
  212. % estado7(E), movimientoPosible(E, M).
  213. % estado2(E), movimientoPosible(E, M).
  214. % movimientoPosible([sobre(piso, cuboGrande), sobre(piso, cuboChico)], M).
  215.  
  216.  
  217. % Ejercicio 7: Solucion
  218. % =====================
  219. %
  220. % realizarMovimiento(+EInicial, +Movimiento, -EFinal)
  221. % Predicado verdadero sii EFinal es el estado resultante de aplicar el
  222. % movimiento Movimiento en el estado EInicial, usando las reglas de
  223. % aplicacion que se encuentran en el enunciado.
  224. % Para esto, primero verificamos si el movimiento es posible, luego
  225. % determinamos el nuevo estado, y finalmente comprobamos que sea valido.
  226. realizarMovimiento(EI, apoyarSobre(A, B), EF) :-
  227. movimientoPosible(EI, apoyarSobre(A, B)),
  228. sacarBloque(EI, B, ET),
  229. EF = [sobre(A, B)|ET],
  230. valido(EF).
  231.  
  232. % sacarBloque(+EI, +B, -EF)
  233. % Verdadero sii el estado EF es igual al estado EI sin el bloque B. Se
  234. % asume que el bloque B es un tope, y que EF es valido.
  235. sacarBloque([], _, []).
  236. sacarBloque([sobre(_, B)|Ss], B, Ss).
  237. sacarBloque([sobre(A, B)|Ss], X, [sobre(A, B)|Fs]) :- sacarBloque(Ss, X, Fs).
  238.  
  239. % Ejercicio 7: Test cases
  240. % =======================
  241. % estado2(E), realizarMovimiento(E, apoyarSobre(piso, cuboMediano), EF).
  242.  
  243.  
  244. % Ejercicio 8: Solucion
  245. % =====================
  246.  
  247. % satisface(+Estado, +Objetivo)
  248. % Predicado que es verdadero si y solo si todos los requerimientos de la
  249. % lista Objetivo se satisfacen en el estado Estado.
  250. % Para verificarlo, debemos ver que, para cada elemento sobre(PA, PB) de
  251. % Objetivo, se cumpla que existen bloques A y B con propiedades PA y PB
  252. % respectivamente, y que A se encuentre sobre B en el estado Estado.
  253. satisface(_, []).
  254. satisface(E, [sobre(PA, PB)|Os]) :-
  255. bloque(A, _, _, PA), bloque(B, _, _, PB),
  256. member(sobre(A, B), E),
  257. satisface(E, Os).
  258.  
  259.  
  260. % Ejercicio 9: Solucion
  261. % =====================
  262.  
  263. % resolver (+ EInicial , +Objetivo, −Movimientos, −EFinal) nums(X,X).
  264.  
  265.  
  266. resolver(EI,Obj,Movs, EF) :- buffResolver(EI,Obj,[],Movs, EF).
  267. buffResolver(EI,Obj,Movs,Movs, EI) :- satisface(EI,Obj).
  268. buffResolver(EI,Obj,BMovs,Movs, EF) :- movimientoPosible(EI,N), not(member(N,BMovs)), realizarMovimiento(EI,Obj,EN),
  269. append(BMovs,[EN],NBMovs), buffResolver(EI,Obj,BMovs, Movs,EF).
  270.  
  271.  
  272.  
  273. % resolver(EI, Obj, Movs, EF) :- nums(0, N), secMovs(EI,N, LMovs), member(Movs, LMovs),
  274. % realizarMovs(EI, Movs, EF), satisface(EF, Obj).
  275.  
  276. nums(X,Y) :- Z is X + 1, nums(Z,Y).
  277.  
  278. secMovs(EI, N, LMovs) :- setof(X, secMovimientos(EI, N, X), LMovs).
  279.  
  280. realizarMovs(EI, [], EI).
  281. realizarMovs(EI, [M|Ms], EF) :- realizarMovimiento(EI, M, ET), realizarMovs(ET, Ms, EF).
  282.  
  283. secMovimientos(_, 0, []).
  284. secMovimientos(E, N, [X|Movs]) :- valido(E), movimientoPosible(E, X),
  285. realizarMovimiento(E, X, EF), NMenosUno is N - 1, NMenosUno >= 0,
  286. secMovimientos(EF, NMenosUno, Movs).
Add Comment
Please, Sign In to add comment