:- set_prolog_flag(verbose,silent).
:- prompt(_, '').
:- use_module(library(readutil)).

main:-
    writeln('Executando a função "main"'),
    writeln('(se você está vendo isso, é porque o programa compilou com sucesso...)'),
	halt.
	
/* Ajudando o compilador... */
term_expansion((?-Term), (?-Term)) :- % Para cada query encontrado durante a compilação...
    clause(Term, Cauda),              % ...verificamos se existe uma chamada de função pra ela...
    analise_estatica(Cauda).          % ...e fazemos uma análise estática da mesma.
term_expansion(Term, Term).           % Se não é chamada de função, está tudo ok.
    
analise_estatica(throw(tipo_invalido)) :- % Se essa função ia lançar tipo_invalido em execução...
    writeln('Erro: tipo inválido'),       % ...reporte ela de uma vez em compilação! :P
    halt.                                 % ...e pare o programa.
analise_estatica(_).                      % Caso contrário está tudo ok! :)

/* Exemplo 3 (declaração) */
distancia(ponto(X1,Y1), ponto(X2,Y2), D) :-
    !,
    D is sqrt((X1-X2)**2 + (Y1-Y2)**2).
distancia(_,_,_) :- throw(tipo_invalido).

?- distancia(ponto(1,2), ponto(3,4), D).
?- distancia(ponto(1,2), ponto(3,4), 5).

:- main.