fork(1) download
  1. :- set_prolog_flag(verbose,silent).
  2. :- prompt(_, '').
  3. :- use_module(library(readutil)).
  4.  
  5. main:-
  6. writeln('Executando a função "main"'),
  7. writeln('(se você está vendo isso, é porque o programa compilou com sucesso...)'),
  8.  
  9. /* Ajudando o compilador... */
  10. term_expansion((?-Term), (?-Term)) :- % Para cada query encontrado durante a compilação...
  11. clause(Term, Cauda), % ...verificamos se existe uma chamada de função pra ela...
  12. analise_estatica(Cauda). % ...e fazemos uma análise estática da mesma.
  13. term_expansion(Term, Term). % Se não é chamada de função, está tudo ok.
  14.  
  15. analise_estatica(throw(tipo_invalido)) :- % Se essa função ia lançar tipo_invalido em execução...
  16. writeln('Erro: tipo inválido'), % ...reporte ela de uma vez em compilação! :P
  17. halt. % ...e pare o programa.
  18. analise_estatica(_). % Caso contrário está tudo ok! :)
  19.  
  20. /* Exemplo 3 (declaração) */
  21. distancia(ponto(X1,Y1), ponto(X2,Y2), D) :-
  22. !,
  23. D is sqrt((X1-X2)**2 + (Y1-Y2)**2).
  24. distancia(_,_,_) :- throw(tipo_invalido).
  25.  
  26. ?- distancia(ponto(1,2), ponto(3,4), D).
  27. ?- distancia(ponto(1,2), ponto(3,4), 5).
  28.  
  29. :- main.
Success #stdin #stdout #stderr 0.02s 6204KB
stdin
Standard input is empty
stdout
Executando a função "main"
(se você está vendo isso, é porque o programa compilou com sucesso...)
stderr
Warning: /home/1fECjv/prog.pl:27:
	Singleton variables: [D]
Warning: /home/1fECjv/prog.pl:28:
	Goal (directive) failed: user:distancia(ponto(1, 2), ponto(3, 4), 5)