:-  prompt( _,  '' ) . 
:-  use_module( library( readutil) ) . 
 
main:- 
	process, 
 
/* Exemplo 1 (declaração) */ 
foo( 42 ) . 
foo( 'bar' ) . 
foo( [ _, _, _| _] ) . 
 
/* Exemplo 2 (declaração) */ 
bar( X, Y, Z)  :- 
    X =  Y, 
    foo( X) , 
    X =  Z. 
 
/* 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
) .  
process:- 
	/* Exemplo 1 (uso) */ 
	(  foo( 42 )              - >  writeln( 'foo(42) é true' )              ;  writeln( 'foo(42) é false' ) ) , 
	(  foo( 10 )              - >  writeln( 'foo(10) é true' )              ;  writeln( 'foo(10) é false' ) ) , 
	(  foo( 1.23 )            - >  writeln( 'foo(1.23) é true' )            ;  writeln( 'foo(1.23) é false' ) ) , 
	(  foo( [ 1 , 2 , 3 , 4 , 5 ] )     - >  writeln( 'foo([1,2,3,4,5]) é true' )     ;  writeln( 'foo([1,2,3,4,5]) é false' ) ) , 
	(  foo( [ 1 , 2 ] )           - >  writeln( 'foo([1,2]) é true' )           ;  writeln( 'foo([1,2]) é false' ) ) , 
	(  foo( qualquer_coisa)  - >  writeln( 'foo(qualquer_coisa) é true' )  ;  writeln( 'foo(qualquer_coisa) é false' ) ) , 
 
	writeln( 'foo(QualquerCoisa) pode ser:' ) , 
	findall ( QualquerCoisa
,  ( foo
( QualquerCoisa
) ,  write ( '    ' ) ,  writeln
( QualquerCoisa
) ) ,  _
) ,   
 
	/* Exemplo 2 (uso) */ 
	bar( X,  [ 1 , A, 3 ] ,  [ B, 2 , C] ) , 
	writeln( 'bar(X, [1,A,3], [B,2,C])' ) , 
	write ( '    X = ' ) ,  writeln
( X
) ,  	write ( '    A = ' ) ,  writeln
( A
) ,  	write ( '    B = ' ) ,  writeln
( B
) ,  	write ( '    C = ' ) ,  writeln
( C
) ,   
	writeln( 'bar(P,_,Q), write(\' Testando:  \'), writeln(P), Q = \' bar\' pode ser:' ) , 
	    bar( P, _, Q) ,  
	    write ( 'Testando: ' ) ,  writeln
( P
) ,   	    Q =  'bar' , 
	    write ( 'Aceitou: ' ) ,  writeln
( P
)  	) ,  _) , 
 
 
	/* Exemplo 3 (uso) */ 
    distancia( ponto( 1 , 2 ) ,  ponto( 3 , 4 ) ,  D) , 
 
    writeln( 'distancia(ponto(1,2), ponto(3,4), D)' ) , 
    write ( '    D = ' ) ,  writeln
( D
) ,   
    write ( 'distancia(ponto(1,2), ponto(3,4), 5) é ' ) ,      ( distancia
( ponto
( 1 , 2 ) ,  ponto
( 3 , 4 ) ,  5 )  - >  writeln
( true )  ;  writeln
( false
) ) ,   
        distancia( foo,  bar,  baz)  - > 
        writeln( 'Ooops! distancia(foo, bar, baz) executou com sucesso!!!' )  ; 
        writeln( 'Ooops! distancia(foo, bar, baz) executou com falha!!!' ) 
    ) ,  tipo_invalido,  writeln( 'Tipo inválido em distancia(foo, bar, baz)' ) ) . 
 
 
:-  main. 
 
				Oi0gc2V0X3Byb2xvZ19mbGFnKHZlcmJvc2Usc2lsZW50KS4KOi0gcHJvbXB0KF8sICcnKS4KOi0gdXNlX21vZHVsZShsaWJyYXJ5KHJlYWR1dGlsKSkuCgptYWluOi0KCXByb2Nlc3MsCgloYWx0LgoKLyogRXhlbXBsbyAxIChkZWNsYXJhw6fDo28pICovCmZvbyg0MikuCmZvbygnYmFyJykuCmZvbyhbXyxfLF98X10pLgoKLyogRXhlbXBsbyAyIChkZWNsYXJhw6fDo28pICovCmJhcihYLFksWikgOi0KICAgIFggPSBZLAogICAgZm9vKFgpLAogICAgWCA9IFouCgovKiBFeGVtcGxvIDMgKGRlY2xhcmHDp8OjbykgKi8KZGlzdGFuY2lhKHBvbnRvKFgxLFkxKSwgcG9udG8oWDIsWTIpLCBEKSA6LQogICAgISwKICAgIEQgaXMgc3FydCgoWDEtWDIpKioyICsgKFkxLVkyKSoqMikuCmRpc3RhbmNpYShfLF8sXykgOi0gdGhyb3codGlwb19pbnZhbGlkbykuCgpwcm9jZXNzOi0KCS8qIEV4ZW1wbG8gMSAodXNvKSAqLwoJKCBmb28oNDIpICAgICAgICAgICAgIC0+IHdyaXRlbG4oJ2Zvbyg0Mikgw6kgdHJ1ZScpICAgICAgICAgICAgIDsgd3JpdGVsbignZm9vKDQyKSDDqSBmYWxzZScpKSwKCSggZm9vKDEwKSAgICAgICAgICAgICAtPiB3cml0ZWxuKCdmb28oMTApIMOpIHRydWUnKSAgICAgICAgICAgICA7IHdyaXRlbG4oJ2ZvbygxMCkgw6kgZmFsc2UnKSksCgkoIGZvbygxLjIzKSAgICAgICAgICAgLT4gd3JpdGVsbignZm9vKDEuMjMpIMOpIHRydWUnKSAgICAgICAgICAgOyB3cml0ZWxuKCdmb28oMS4yMykgw6kgZmFsc2UnKSksCgkoIGZvbyhbMSwyLDMsNCw1XSkgICAgLT4gd3JpdGVsbignZm9vKFsxLDIsMyw0LDVdKSDDqSB0cnVlJykgICAgOyB3cml0ZWxuKCdmb28oWzEsMiwzLDQsNV0pIMOpIGZhbHNlJykpLAoJKCBmb28oWzEsMl0pICAgICAgICAgIC0+IHdyaXRlbG4oJ2ZvbyhbMSwyXSkgw6kgdHJ1ZScpICAgICAgICAgIDsgd3JpdGVsbignZm9vKFsxLDJdKSDDqSBmYWxzZScpKSwKCSggZm9vKHF1YWxxdWVyX2NvaXNhKSAtPiB3cml0ZWxuKCdmb28ocXVhbHF1ZXJfY29pc2EpIMOpIHRydWUnKSA7IHdyaXRlbG4oJ2ZvbyhxdWFscXVlcl9jb2lzYSkgw6kgZmFsc2UnKSksCgkKCXdyaXRlbG4oJ2ZvbyhRdWFscXVlckNvaXNhKSBwb2RlIHNlcjonKSwKCWZpbmRhbGwoUXVhbHF1ZXJDb2lzYSwgKGZvbyhRdWFscXVlckNvaXNhKSwgd3JpdGUoJyAgICAnKSwgd3JpdGVsbihRdWFscXVlckNvaXNhKSksIF8pLAoJCglubCwKCQoJLyogRXhlbXBsbyAyICh1c28pICovCgliYXIoWCwgWzEsQSwzXSwgW0IsMixDXSksCgl3cml0ZWxuKCdiYXIoWCwgWzEsQSwzXSwgW0IsMixDXSknKSwKCXdyaXRlKCcgICAgWCA9ICcpLCB3cml0ZWxuKFgpLAoJd3JpdGUoJyAgICBBID0gJyksIHdyaXRlbG4oQSksCgl3cml0ZSgnICAgIEIgPSAnKSwgd3JpdGVsbihCKSwKCXdyaXRlKCcgICAgQyA9ICcpLCB3cml0ZWxuKEMpLAoJCgl3cml0ZWxuKCdiYXIoUCxfLFEpLCB3cml0ZShcJ1Rlc3RhbmRvOiBcJyksIHdyaXRlbG4oUCksIFEgPSBcJ2JhclwnIHBvZGUgc2VyOicpLAoJZmluZGFsbChQLCAoCgkgICAgYmFyKFAsXyxRKSwgCgkgICAgd3JpdGUoJ1Rlc3RhbmRvOiAnKSwgd3JpdGVsbihQKSwgCgkgICAgUSA9ICdiYXInLAoJICAgIHdyaXRlKCdBY2VpdG91OiAnKSwgd3JpdGVsbihQKQoJKSwgXyksCgoJbmwsCgkKCS8qIEV4ZW1wbG8gMyAodXNvKSAqLwogICAgZGlzdGFuY2lhKHBvbnRvKDEsMiksIHBvbnRvKDMsNCksIEQpLAogICAgCiAgICB3cml0ZWxuKCdkaXN0YW5jaWEocG9udG8oMSwyKSwgcG9udG8oMyw0KSwgRCknKSwKICAgIHdyaXRlKCcgICAgRCA9ICcpLCB3cml0ZWxuKEQpLAoJCiAgICB3cml0ZSgnZGlzdGFuY2lhKHBvbnRvKDEsMiksIHBvbnRvKDMsNCksIDUpIMOpICcpLAogICAgKGRpc3RhbmNpYShwb250bygxLDIpLCBwb250bygzLDQpLCA1KSAtPiB3cml0ZWxuKHRydWUpIDsgd3JpdGVsbihmYWxzZSkpLAogICAgCiAgICBjYXRjaCgoCiAgICAgICAgZGlzdGFuY2lhKGZvbywgYmFyLCBiYXopIC0+CiAgICAgICAgd3JpdGVsbignT29vcHMhIGRpc3RhbmNpYShmb28sIGJhciwgYmF6KSBleGVjdXRvdSBjb20gc3VjZXNzbyEhIScpIDsKICAgICAgICB3cml0ZWxuKCdPb29wcyEgZGlzdGFuY2lhKGZvbywgYmFyLCBiYXopIGV4ZWN1dG91IGNvbSBmYWxoYSEhIScpCiAgICApLCB0aXBvX2ludmFsaWRvLCB3cml0ZWxuKCdUaXBvIGludsOhbGlkbyBlbSBkaXN0YW5jaWEoZm9vLCBiYXIsIGJheiknKSkuCgoKOi0gbWFpbi4=