fork(1) download
  1. :- set_prolog_flag(verbose,silent).
  2. :- prompt(_, '').
  3. :- use_module(library(readutil)).
  4.  
  5. main:-
  6. process,
  7.  
  8. /* Exemplo 1 (declaração) */
  9. foo(42).
  10. foo('bar').
  11. foo([_,_,_|_]).
  12.  
  13. /* Exemplo 2 (declaração) */
  14. bar(X,Y,Z) :-
  15. X = Y,
  16. foo(X),
  17. X = Z.
  18.  
  19. /* Exemplo 3 (declaração) */
  20. distancia(ponto(X1,Y1), ponto(X2,Y2), D) :-
  21. !,
  22. D is sqrt((X1-X2)**2 + (Y1-Y2)**2).
  23. distancia(_,_,_) :- throw(tipo_invalido).
  24.  
  25. process:-
  26. /* Exemplo 1 (uso) */
  27. ( foo(42) -> writeln('foo(42) é true') ; writeln('foo(42) é false')),
  28. ( foo(10) -> writeln('foo(10) é true') ; writeln('foo(10) é false')),
  29. ( foo(1.23) -> writeln('foo(1.23) é true') ; writeln('foo(1.23) é false')),
  30. ( foo([1,2,3,4,5]) -> writeln('foo([1,2,3,4,5]) é true') ; writeln('foo([1,2,3,4,5]) é false')),
  31. ( foo([1,2]) -> writeln('foo([1,2]) é true') ; writeln('foo([1,2]) é false')),
  32. ( foo(qualquer_coisa) -> writeln('foo(qualquer_coisa) é true') ; writeln('foo(qualquer_coisa) é false')),
  33.  
  34. writeln('foo(QualquerCoisa) pode ser:'),
  35. findall(QualquerCoisa, (foo(QualquerCoisa), write(' '), writeln(QualquerCoisa)), _),
  36.  
  37. nl,
  38.  
  39. /* Exemplo 2 (uso) */
  40. bar(X, [1,A,3], [B,2,C]),
  41. writeln('bar(X, [1,A,3], [B,2,C])'),
  42. write(' X = '), writeln(X),
  43. write(' A = '), writeln(A),
  44. write(' B = '), writeln(B),
  45. write(' C = '), writeln(C),
  46.  
  47. writeln('bar(P,_,Q), write(\'Testando: \'), writeln(P), Q = \'bar\' pode ser:'),
  48. findall(P, (
  49. bar(P,_,Q),
  50. write('Testando: '), writeln(P),
  51. Q = 'bar',
  52. write('Aceitou: '), writeln(P)
  53. ), _),
  54.  
  55. nl,
  56.  
  57. /* Exemplo 3 (uso) */
  58. distancia(ponto(1,2), ponto(3,4), D),
  59.  
  60. writeln('distancia(ponto(1,2), ponto(3,4), D)'),
  61. write(' D = '), writeln(D),
  62.  
  63. write('distancia(ponto(1,2), ponto(3,4), 5) é '),
  64. (distancia(ponto(1,2), ponto(3,4), 5) -> writeln(true) ; writeln(false)),
  65.  
  66. distancia(foo, bar, baz) ->
  67. writeln('Ooops! distancia(foo, bar, baz) executou com sucesso!!!') ;
  68. writeln('Ooops! distancia(foo, bar, baz) executou com falha!!!')
  69. ), tipo_invalido, writeln('Tipo inválido em distancia(foo, bar, baz)')).
  70.  
  71.  
  72. :- main.
Success #stdin #stdout 0.02s 6204KB
stdin
Standard input is empty
stdout
foo(42) é true
foo(10) é false
foo(1.23) é false
foo([1,2,3,4,5]) é true
foo([1,2]) é false
foo(qualquer_coisa) é false
foo(QualquerCoisa) pode ser:
    42
    bar
    [_G414, _G417, _G420|_G421]

bar(X, [1,A,3], [B,2,C])
    X = [1, 2, 3]
    A = 2
    B = 1
    C = 3
bar(P,_,Q), write('Testando: '), writeln(P), Q = 'bar' pode ser:
Testando: 42
Testando: bar
Aceitou: bar
Testando: [_G496, _G499, _G502|_G503]

distancia(ponto(1,2), ponto(3,4), D)
    D = 2.82843
distancia(ponto(1,2), ponto(3,4), 5) é false
Tipo inválido em distancia(foo, bar, baz)