fork download
  1. /****************** magica.pro ******************/
  2.  
  3. /* Defino minha mini-linguagem */
  4.  
  5. :-op(10, fy, [dado, um, vetor, com, no, qual, o, primeiro, eh, ultimo, intermediarios,
  6. sao, incrementos, do, seja, para, se, elemento, imprima, fim]).
  7. :-op(20, xfy, [elementos, e, um, de, a, do, primo]).
  8. :-op(30, xfy, [faca]).
  9.  
  10. /* Defino os comandos da minha mini-linguagem */
  11.  
  12. term_expansion((dado um vetor com _ elementos no qual o primeiro eh A e o ultimo B e
  13. os elementos intermediarios sao incrementos do mesmo), vetor(V)) :-
  14. criar_vetor(A,B,V).
  15.  
  16. term_expansion((seja i um inteiro), inteiro(i)). % Não interessa...
  17.  
  18. term_expansion((para I de A a B faca C), _) :-
  19. criar_vetor(A,B,V), % Seja um vetor de A a B
  20. member(X,V), % e X um membro desse vetor
  21. chame(C,I,X), % Faça o que foi pedido, usando I como alias pra X
  22. fail. % Faça de conta que falhou. Tente de novo, com um novo membro
  23. term_expansion((para _ de _ a _ faca _), feito). % Todos os números de A a B foram visitados
  24.  
  25. chame((se o elemento I do vetor eh um numero primo ProximaInstrucao), I, X) :-
  26. vetor(V),
  27. elemento(X,V,E),
  28. (primo(E) -> chame(ProximaInstrucao, I, E)).
  29.  
  30. chame((imprima I), I, X) :-
  31. writeln(X).
  32.  
  33. term_expansion(fim do programa, fim_do_programa). % Não interessa...
  34.  
  35. /* Implemento os comandos */
  36.  
  37. criar_vetor(A,A,[A]).
  38. criar_vetor(A,B,[A|R]) :-
  39. A < B,
  40. A1 is A + 1,
  41. criar_vetor(A1,B,R).
  42.  
  43. elemento(_,[],_) :- fail.
  44. elemento(1,[E|_],E) :- !.
  45. elemento(X,[_|R],E) :-
  46. X1 is X - 1,
  47. elemento(X1,R,E).
  48.  
  49. primo(X) :- % X não é primo se
  50. X1 is X - 1,
  51. criar_vetor(2,X1,V), % dado um vetor de 2 a X-1
  52. member(Y,V), % existe um Y membro desse vetor
  53. 0 =:= X mod Y, % tal que X é multiplo de Y
  54. !, fail.
  55. primo(_). % Caso contrário ele é primo
  56.  
  57. /****************** codegolf.pro ******************/
  58.  
  59. dado um vetor com 20 elementos
  60. no qual o primeiro eh 1 e o ultimo 20 e os
  61. elementos intermediarios sao incrementos do mesmo.
  62. seja i um inteiro.
  63. para i de 3 a 15 faca
  64. se o elemento i do vetor eh um numero primo
  65. imprima i.
  66. fim do programa.
  67.  
  68. /****************** ideone boilerplate ******************/
  69.  
  70. :- set_prolog_flag(verbose,silent).
  71. :- prompt(_, '').
  72. :- use_module(library(readutil)).
  73.  
  74. main:-
  75. process,
  76.  
  77. process:-
  78. /* your code goes here */
  79.  
  80. :- main.
Success #stdin #stdout 0.04s 6160KB
stdin
Standard input is empty
stdout
3
5
7
11
13