%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO - MIEB/4

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SEMANA 05: 20.OUT.2014 - 17.OUT.2014

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%RESOLUÇÃO DA FICHA Nº5

%--------------------------------- - - - - - - - - - -  -  -  -  -   -

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SICStus PROLOG: Declaracoes iniciais

:- set_prolog_flag( discontiguous_warnings,off ).
:- set_prolog_flag( single_var_warnings,off ).
:- set_prolog_flag( unknown,fail ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SICStus PROLOG: definicoes iniciais

:- dynamic vem_automovel/0.
:- dynamic vem_comboio/0.
:- dynamic '-'/1.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Negação por falha na prova
%Extensão do meta-predicado nao

nao( X ) :- X,!,fail.
nao( X ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado demo: Questao,Resposta -> {V,F}

demo( Questao,verdadeiro ) :-
    Questao.
demo( Questao,falso ) :-
    -Questao.
demo( Questao,desconhecido ) :-
    nao( Questao ),
    nao( -Questao ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa a extensão de um predicado capaz de caracterizar os números pares.
% Extensao do predicado par: N -> {V,F,D}

par( 0 ).
par( X ) :-
	N is X-2,
	N >= 0,
	par( N ).

-par( X ) :-
	nao( par( X ) ).

%Da forma que este predicado está escrito, tudo o que não for par, é ímpar, não há valores desconhecidos.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa a extensão de um predicado capaz de caracterizar os números ímpares.
% Extensao do predicado impar: N -> {V,F,D}

impar( 1 ).
impar( X ) :- 
	N is X-2,
	N >=1,
	impar( N ).

-impar( 0 ).
-impar( X ) :-
	N is X-2,
	N >= 0,
	-impar( N ).

%Se X é positivo e não é par, então é impar.
%Se X é negativo, o resultado é desconhecido.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa a extensão de um predicado que caracterize o conjunto dos números naturais.
% Extensao do predicado natural: N -> {V,F,D}

natural( X ) :-
	X>=1.
-natural( X ) :- X=<0.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa a extensão de um predicado que caracterize o conjunto dos números inteiros.
% Extensao do predicado inteiro: I -> {V,F,D}

inteiro( 0 ).
inteiro( X ) :- natural( X ).
inteiro( X ) :- natural(-X ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa a extensão de um predicado capaz de caracterizar as cores do arco-iris.

cor(vermelho).
cor(laranja).
cor(amarelo).
cor(verde).
cor(azul).
cor(anil).
cor(violeta).

arcoiris( X ) :- cor( X ).
-arcoiris( X) :- nao(cor(X)).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa a extensão de um predicado com capacidade para identificar as cores dos equipamentos, oficial e alternativos, do Vitória.

corV(branco).
corV(preto).

vitoria(X) :- corV(X).
-vitoria(X) :- nao(corV(X)).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construa um programa capaz de representar a autorização de atravessar a estrada baseado na não existência de automóveis em aproximação, 
% e, ainda, a autorização de atravessar o caminho de ferro pela confirmação da inexistência de um comboio em aproximação.


atravessar( estrada ) :- nao( vem_automovel ).

atravessar( ferrovia ) :- -( vem_comboio ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Tendo em consideração o grafo ilustrado na Figura 1, desenvolva um programa com a capacidade para definir o significado de «nodo terminal»,
% baseado na descrição de grafos pela definição de nodos e de arcos

arco( b,a ).
arco( b,c ).
arco( c,a ).
arco( c,d ).
arco( f,g ).

nodo( a ).
nodo( b ).
nodo( c ).
nodo( d ).
nodo( e ).
nodo( f ).
nodo( g ).
	
terminal( X ) :-
	nodo( X ),
	nao(arco( X,Y )).

-terminal( X ) :-
	nodo( X ),
	arco( X,Y ).
