VinBR

LP 09/11/2011

Nov 29th, 2011
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.90 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. Joe A. Robinson escreveu um artigo sobre a unificação que é um dos mais citados em computação.
  9.  
  10. A busca é pelo Most General Unifier (MGU)
  11.  
  12. pai(x,y) = pai(x,f)
  13.  
  14. Qual o menor predicado que faria dessa afirmação verdadeira?
  15.  
  16. {y=f}
  17. mas existem outras que também teriam esse efeito ex:
  18. {y=f, x=joao)
  19.  
  20. Mas a mais geral é a primeira.
  21.  
  22. ?- reverse([1,2,3], X).
  23. imprime na tela:
  24. X = [3, 2, 1].
  25.  
  26. ?- X=0, Y is X + 1
  27. imprime:
  28. X=0,
  29. Y=1.
  30.  
  31. programa em prolog:
  32. p :- q, r. /* boolean p() { return q() && r(); } */
  33. q :- s. /* boolean p() { return s(); } */
  34. r :- s. /* boolean r() { return s(); } */
  35. s. /* boolean s() { return true; } */
  36.  
  37. p :- q, r. /* boolean p() { return ; }*/
  38. p :- s. /* boolean p() { return ; }*/
  39. p. /* boolean p() { return ; }*/
  40. r. /* boolean p() { return ; }*/
  41. s :- /* boolean p() { return ; }*/
  42.  
  43. ?- X = f(X)
  44. imprime:
  45. X = f(**) // (asteriscos duplos indicam infinidade)
  46.  
  47. ?- append([], X, [a|X]).
  48. X = [a|**]
  49.  
  50. ?- N = N + 1
  51. N = ** + L
  52.  
  53. ?- N is N + 1
  54. ERROR: is/2: Arguments are not sufficiently instantiated.
  55.  
  56. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  57.  
  58. Vamos programar em pseudo-codigo um interpretador de Prolog:
  59.  
  60. function res (clause, goals)
  61. let sub = MGU ( hd (clause), hd(goals))
  62. return sub((tl(clause)) @ t1(goals))
  63.  
  64. function solve(goals)
  65. if goals = nil then succeed()!!!
  66. else para cada clause c in program, /* em ordem */ faça:
  67. if hd(c) nao unifica com hd(goals) then fail!!!
  68. else solve(res(c, goals))
  69.  
  70. reverse(Y,Y).
  71. reverse(Y,X) :- ....
  72.  
  73. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  74.  
  75. Vamos tentar usar nosso interpretador para ver se isso funciona.
  76.  
  77. p(f(Y)) :- q(Y), r(Y).
  78. q(g(Z)).
  79. q(h(Z)).
  80. r(h(a)).
  81.  
  82. Se tentarmos:
  83. ? p(X)
  84. X = (f(h))(a)
  85.  
  86. goal(p(X))
  87. O programa tem 4 clausulas. (cada linha) e cada clausula é uma lista.
  88. s(p(X))
  89. s( Res ([p(f(Y)), q(Y), r(Y)], [p(X)]) )
  90. Daqui casando a cabeça das listas temos: X = f(Y)
  91. removendo a cabeça da clausula e substituindo X=f(Y) não obtemos nada já que não há ocorrencias de X na clausula então fica:
  92. s([q(Y), r(Y)])
  93. s( Res ([p(f(Y)), q(Y), r(Y)], [q(Y), r(Y)]) )
  94. recursivamente, repetidos o processo do res.
  95. Vamos buscar a unificação: na clausula 1: encontramos? não. na clausula 2? sim.
  96. na 3 também mas vamos empilhar e voltar depois, na 4 não.
  97.  
  98. s(res([q(g(z))],[q(Y),r(Y)]))
  99. verifique que a primeira clausula e meta se unificam gerando: Y=g(z)
  100. substituindo isso na outra meta temos:
  101.  
  102. s([r(g(Z))])
  103. mas verificando as clausulas, não encontramos solução, então desistimos desse caminho.
  104.  
  105. Vamo desempilhar a clausula 3 que empilhamos a pouco.
  106. Y = h(z)
  107. S(res( [g(h(Z))], [g(Y), r(Y)] ))
  108.  
  109. unificando as cabeças temos:
  110. Y=h(Z)
  111.  
  112. substituindo temos:
  113.  
  114. S([r(h(Z))])
  115. unificando com a quarta clausula temos que:
  116. {Z = a}
  117.  
  118. S( res( [r(h(a))], [r(h(Z))] ))
  119. de algum modo chegamos em S([])
  120. que encerra o processamento.
  121.  
  122. X = f(Y), Y= h(Z), Z = a
  123. isso gera uma solução válida.
  124.  
  125. X = f(h(a))
  126.  
  127. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  128.  
  129. p :- p.
  130. p.
  131.  
  132. // o professor chamou ? consult(p)
  133. Como o programa analiza as clausulas em ordem, ele entra em loop, pois para ele provar que a meta p é verdade ele precisa primeiro de provar que p é verdade =/.
  134. acho que é isso. ou o inverso disso.
  135.  
  136. agora:
  137.  
  138. p.
  139. p :- p.
  140.  
  141. seria verdade infinitas vezes, mas ele pararia após imprimir o primeiro p e só continuaria imprimindo por requisição do usuário.
  142.  
  143. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  144.  
  145. vamos programar uma funções append A:
  146.  
  147. A([], L, L).
  148. A([H|Ta], B, [H|Tc]) :- A(Ta, B, Tc).
  149.  
  150. S( A(X, Y, [1,2]))
  151. quantos casos isso é verdade? 3.
  152. o prolog nós veremos tentará 4 e uma falhará.
  153.  
  154. chamando pra primeira clausula temos que:
  155. { X = [], Y=L0, [1,2]=L0 }
  156. S(A([],L0,[1,2])) // não é necessário continuar,
  157. mass é necessário casar os dois últimos termos.
  158. chegariamos que Y0 = [1,2].
  159.  
  160. Agora ele tentou voltar pro inicio e tentar a partir da segunda clausula,
  161. ele repetiu os passos para solucionar essa afirmativa também.
  162.  
  163. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  164.  
  165. // Nesse finzinho de aula iremos falar de reflexão.
  166. // Isso é a capacidade de uma linguagem de observer seu próprio funcionamento.
  167.  
  168. Em java nos teriamos reflexão passiva, podemos observar o tipo de um dado, durante sua execução, e entender quantos campo ela tem.
  169. Em python temos reflexão ativa. Podemos alterar por exemplo uma função de uma classe em tempo de execução.
  170.  
  171. prolog tem também reflexão passiva.
  172. Não havendo estados em prolog, é preciso
  173.  
  174. ( a extensão de prolog é .pl )
  175.  
  176. report :- write('Voce esta aqui: '), at(You), write(You), nn1
  177.  
  178. step(Dest) :-
  179. at(You),
  180. connect(You, Dest),
  181. //Para dizer que um estado mudou, ou seja dizer que at(You) agora é falso, porque voce se moveu:
  182. retract(at(You)),
  183. assert(at(Dest)),
  184. write('Voce acabou de sair de: '), write(You), n1
  185. write('Voce acabou de chegar em: '), write(Dest), n1
  186.  
  187. Para demonstrar isso ele deu vários asserts que definirão algumas verdades para o inicio do funcionamento do programa.
  188. ?- assert(connect(a,b)).
  189. Definiu que a conecta-se a b.
  190. e deu tb assert(at(a)). então voce esta em a no inicio, e mostrou como isso funciona.
Advertisement
Add Comment
Please, Sign In to add comment