VinBR

LP 16/11/2011

Nov 29th, 2011
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.56 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. Falando de atomos em prolog.
  9.  
  10. Todas as estruturas são atomos sem muitos significados atribuidos a eles, como nós estamos acostumados.
  11.  
  12. por exemplo se pergunto:
  13.  
  14. ?- X = 2 + 1
  15. é retornado:
  16. X = 2+1
  17.  
  18. Hoje vamos falar sobre a interpretação semantica em prolog, ou seja, como fazer para aquela soma acima retornar 3?
  19.  
  20. myLength([],0).
  21. myLength([_|Tail], Len) :- myLength(Tail, TailLen), Len = TailLen + 1.
  22. O que isso retorna para:
  23.  
  24. ?- myLength([1,2,3],X).
  25.  
  26. retorna: X = 0+1+1+1
  27.  
  28. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  29.  
  30. A semantica is faz:
  31. avalio a da direita e unifico com a da esquerda.
  32.  
  33. assim:
  34. X is 2 + 1
  35. retorna:
  36. X = 3
  37.  
  38. 3 is 2+1.
  39. retorna:
  40. true.
  41.  
  42. 2+1 is 3
  43. retorna:
  44. false.
  45.  
  46. 3 is X
  47. da erro pois X ainda não foi instanciado.
  48.  
  49. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  50.  
  51. A semantica de =:= avalia ambos os lados, e unifica os resultados assim temos:
  52.  
  53. 2+1 =:= 3.
  54. true.
  55.  
  56. 2+1 =:= 1+2
  57. true.
  58.  
  59. mas:
  60. 2+1 =:= X
  61. da erro de compilação pois X ainda não foi instanciado.
  62.  
  63. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  64.  
  65. A semantica do == é como a do =:=.
  66.  
  67. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  68.  
  69. façamos uma função para somar uma lista.
  70.  
  71. sum([],0).
  72. sum([H|T], N) :- sum(T, N1), N is H + N1.
  73.  
  74. Realizar a chamada:
  75. sum(X, 2).
  76. gera erro porque?
  77. porque o H a direita do is na função sum não teria sido definido.
  78.  
  79. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  80.  
  81. fact(0,1).
  82. fact(1,1).
  83. fact(N,F) :- integer(N), N > 1, N1 is N-1, fact (N1, F1), F is F1 * N;
  84.  
  85. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  86.  
  87. Função para detectar primos:
  88.  
  89. is_prime(2).
  90. is_prime(3).
  91.  
  92. is_prime(P) :- integer(P), P > 3, P mod 2 =\= 0, \+ has_factor(P,3).
  93.  
  94. has_factor(N, L) :- N mod L =:= 0.
  95. has_factor(N, L) :- L * L < N, L2 is L + 2, has_factor(N, L2).
  96.  
  97. O professor pediu um aluno por um número de 5 digitos primo, o cara arranjou um:
  98. 24113
  99. E era primo mesmo xP.
  100.  
  101. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  102.  
  103. Vamos fazer uma função range, que diz se uma lista representa uma sequencia de número do numéro I ao K?
  104.  
  105. "range(I, K, L)"
  106.  
  107. // Eu perdi a implementação disso.
  108.  
  109. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  110.  
  111. como fazer para descobrir todos os números primos dentro de um determinado range?
  112.  
  113. range(2, 14, L), member(N, L), is_prime(N).
  114.  
  115. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  116.  
  117. Vamos tentar criar um algoritimo de um problema NP-Completo?
  118.  
  119. Seja o problema de descobrir se dado um conjunto de números, existe uma subconjunto cuja soma seja N.
  120.  
  121. Vamos fazer então uma função intSum:
  122.  
  123. intSum(L, N, S) :- subList(L, S), sum(S, N).
  124.  
  125. subList([], []).
  126. subList([H|T], [H|R]) :- subList(T,R).
  127.  
  128. Isso soluicionaria um problema NP completo em 6 linhas.
  129. Mas ainda não consegui copiar tudo.
  130.  
  131. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  132.  
  133. Vamos resolver outro problema NP, o problema das 8 rainhas:
  134. Para quais posições 8 rainhas poderiam ficar em um tabuleiro de xadrez sem estarem na mira uma das outras?
  135.  
  136. legal([]).
  137. legal([]) :-
  138. member(X, [1,2,3,4,5,6,7,8])
  139. member(Y, [1,2,3,4,5,6,7,8])
  140. noCheck(X/Y, Rest). //ou seja essa rainha não coloca nenhuma das rainhas da lista em cheque.
  141.  
  142. noCheck(_, []).
  143. noCheck(X/Y, [X1/Y1 | Rest ]) :-
  144. X =/= X1,
  145. Y =/= Y1,
  146. abs(Y1-Y) =/= abs(X1-X),
  147. noCheck(X/Y, Rest).
  148.  
  149. Isso deve funcionar, porém, vai gerar soluções praticamente iguais.
  150. Para evitar isso podemos fazer:
  151. ? length X is 8, e X is [1/_, 2/_, 3/_, 4/_, 5/_, 6/_, 7/_, 8/_], legal(X), findAll
  152. // foi algo assi, ele encontrou 92 posiçòes diferentes.
  153.  
  154. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  155.  
  156. Seja um arquivo dicionário de uma linguagem:
  157.  
  158. casa.
  159. pato.
  160. escola.
  161. mingau.
  162.  
  163. Para sabermos se uma palavra é um anagrama nessa linguagem,
  164. perm([], []).
  165. perm(L, [H|T]) :- select(H, L, T), perm(R,T).
  166.  
  167. file_to_list(FILE, LIST) :-
  168. see(FILE), inquire([], LIST), seen.
  169.  
  170. inquire(IN, OUT) :-
  171. read(Data == end_of_file -> OUT = IN; atom_codes(Data, LData), inquire(LData|IN, OUT).
  172.  
  173. find_anagram(Dic, A, S) :-
  174. file_to_list(Dic, L), perm(A, X), member(X, L), name(S, X).
  175.  
  176. // Bem nao consegui copiar tudinho eu acho. mas isso acho que foi quase tudo.
  177. // Fim da aula!
Advertisement
Add Comment
Please, Sign In to add comment