VinBR

LP 07/11/2011

Nov 29th, 2011
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.94 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. Hoje estamos falando de prolog.
  9.  
  10. X = kim
  11. Y = holly
  12. X = margaret
  13. Y = kim
  14. X = margaret
  15.  
  16. greatgrandparent(A,B) :- parent (A, C), parent (C, D), parent(D, B)
  17. // O escopo de uma variável declarada nessa linha acima termina ao fim da linha.
  18. na funçào acima greatgrandparent é verdadeiro só se os 3 parents forem também verdade.
  19.  
  20. Agora como fazer para saber se x é ancestral de y?
  21.  
  22. ancestor(X, Y) :- parent (X,Y)
  23. ancestor(X, Y) :- parent (C,Y), ancestor(X, C)
  24.  
  25. // Prolog é uma linguagem lógica.
  26. // e a familia de linguagens logicas que são declarativas é na verade só o prolog, e derivados dele.
  27.  
  28. // Note que a ordem que voce coloca as coisas após :- não deveria importar, bastaria que fossem verdade.
  29. // na prática a ordem importa.
  30.  
  31. // Prolog é quase estaticamente tipada já que só existe 1 tipo o "atomo"
  32. // na prática o significado do atomo só é descoberto em tempo de execução e portanto pode-se dizer que é dinamicamente tipada.
  33.  
  34. // Casamento de padrão:
  35.  
  36. A(X, Y, Z) será verdade se X@Y = Z
  37.  
  38. A([], L, L).
  39. A([H|T], B, [H|Tx]) :- A(T, B, Tx).
  40. // E isso já basta.
  41.  
  42. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  43.  
  44. mmember(X, L), é verdade quando X for um atomo presente na lista L.
  45.  
  46. mmember(X, [x|_]).
  47. mmember(X, [_|L]) :- mmember(X, L).
  48. // E isso basta.
  49.  
  50. ?- select(X, [1,2,3], L).
  51. // seleciona e exclui um membro da lista.
  52.  
  53. mselect(H, [H|T], T).
  54. mselect(X, [H|T], [H|L]) :- mselect(X, T, L).
  55. // Isso funciona.
  56.  
  57. Como reverter uma lista?
  58. mreverse(L, L*). retorna true se L for o reverso de L*
  59.  
  60. mreverse([],[]).
  61. mreverse([H|T], X) :- mreverse(T, Tx), A(Tx, [H], X).
  62. // Isso basta, note que quando voce chama uma dessas funções o prolog te retorna vários valores possíveis para as variáveis indefinidas.
  63. // parece que letras maiusculas são consideradas variáveis.
  64. // Outra nota, prolog é um algoritimo de tentativa e erro, e ele tenta atribuir valores as variaveis, e vai mostrando todos os verdadeiros que ele encontrar.
  65.  
  66. vamos aprender a usar o not():
  67. seja uma função sibling (parente)
  68.  
  69. sibling(A,X) se A irmao de X
  70.  
  71. sibling(X, Y) :- parent(C,X), parent(C,Y).
  72. // Essa solução retorna que vinicius é irmão de vinicius (e nao queremos isso) como evitar?
  73.  
  74. sibling(X, Y) :- not(X = Y), parent(C,X), parent(C,Y).
  75. // Isso da sempre falso, porque?
  76. // porque x e y na atribuiçào ainda não tem significado.
  77. // Como corrigir?
  78.  
  79. sibling(X, Y) :- parent(C,X), parent(C,Y), not(X = Y).
  80. // Isso funciona, pois X é filho de C e Y é filho de C, e ambos não podem ser iguais.
  81.  
  82. vamos criar a função sublist:
  83.  
  84. sublist([], []).
  85. sublist([H|T], [H|L]) :- sublist(T,L).
  86. sublist([_|T], L) :- sublist(T, L).
  87. // ou seja se a sublista esta no inicio ou no meio.
  88.  
  89. intercect(L1, L2) :- member(H, L1), member(H,L2).
  90. // Isso é mto proximo da linguagem de alto nivel.
  91.  
  92. perm(L, L') é verdade se L é permutação de L'
  93.  
  94. perm([], []).
  95. perm(T, L) :- member(H, T), select(H, T, L1), perm(L1, L2, select(H, T, L1), perm(L1, L2).
  96. // outra opção:
  97. perm([H|T], L) :- perm(T, Lx), select(H, L, Lx).
  98. // Também funciona da mesma forma.
  99.  
  100. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  101.  
  102. // hellow world de prolog:
  103.  
  104. seja o lado oeste e lado leste de um rio.
  105. do lado esquerdo temos: temos um coelho um lobo, uma cabra e um pastor.
  106. existe um conjunto de regras que impede que alguns dos membros fiquem sozinhos em um mesmo lugar.
  107.  
  108. solution().
  109.  
  110. Pode-se pensar nesse problema como uma lista de 4 posições: [Padre, Ovelha, Coelho, repolho, lobo)
  111. pode-se dizer que em cada posição dessa lista há uma posição leste ou oeste.
  112.  
  113. solution([l,l,l,l], []). // é uma solução. (a segunda lista é a lista de movimentos)
  114. solution(Config, [Move|Rest]) :- move(Config, Move, NextConfig), safe(NextConfig), solution(NextConfig, rest).
  115.  
  116. o que é seguro?
  117. safe([man, wolf, goat, cabbage]) :- oneEq(Man, Wolf, Goat), oneEq(Man, Goat, Cabbage)
  118.  
  119. oneEq(X, X, _). // so retorna verdadeiro se o homem estiver protegendo ao menos um dos membros da cadeia.
  120. oneEq(X, _, X).
  121.  
  122. move([X, X, Goat, Cabbage], wolf, [Y, Y, Goat, Cabbage]) :- change (X,Y).
  123. move([X, Wolf, X, Cabbage], wolf, [Y, Y, Goat, Cabbage]) :- change (X,Y).
  124. move([X, Wolf, Goat, X], wolf, [Y, Y, Goat, Cabbage]) :- change (X,Y).
  125. move([X, Wolf, Goat, Cabbage], wolf, [Y, Y, Goat, Cabbage]) :- change (X,Y).
  126.  
  127. ao chamar um program em verilog posso:
  128. ? lenght(X, 7), solution([o,o,o,o],X).
  129. sendo X movimentos o numero de movimentos exigidos é 7.
  130. Assim voce evita que o programa tente entrar em loops infinitos,
  131. sem esse lenght na chamada o programa de fato entrou em loop.
Advertisement
Add Comment
Please, Sign In to add comment