%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO - MIEB/4

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SEMANA 05: 13.OUT.2014 - 17.OUT.2014

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Invariantes

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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

:- op( 900,xfy,'::' ).
:- dynamic filho/2.
:- dynamic pai/2.
:- dynamic neto/2.
:- dynamic avo/2.
:- dynamic descendente/3.


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Base de Conhecimento
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do predicado filho: Filho,Pai -> {V,F,D}

filho( joao,jose ).
filho( jose,manuel ).
filho( carlos,jose ).
filho(margarida,_).

% PREDICADOS

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado soluÁıes: X,Y,Z -> {V,F}

solucoes( X,Y,Z ) :-
findall( X,Y,Z ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado comprimento: S,N -> {V,F}
comprimento( S,N ) :-
length( S,N ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado filho/pai: F,P -> {V,F}

filho( F,P ) :- pai( P,F ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado avo: A,N -> {V,F}

avo( A,N ) :-
pai( A,X ),
pai( X,N ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado neto: N,A -> {V,F}

neto( N,A ) :-
avo( A,N ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado descendente: D,A,G -> {V,F}

descendente( D,A,1 ):-
filho( D,A ).

descendente( D,A,G ):-
filho( D,X ),
descendente( X,A,Y ), G is Y+1.


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Invariantes Estruturais:  nao permitir a insercao de conhecimento repetido
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o se admitir· a existÍncia de mais do que uma ocorrÍncia da mesma evidÍncia
% na relaÁ„o filho/2;

+filho( F,P ) :: ( solucoes( (F,P),(filho(F,P)), S),
comprimento( S,N ), N==1
).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o se admitir· a existÍncia de mais do que uma ocorrÍncia da mesma evidÍncia na
% relaÁ„o pai/2

+pai( P,F ) :: ( solucoes( (P,F),(pai(P,F)),S),
comprimento( S,N ), N==1 ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o se admitir· a existÍncia de mais do que uma ocorrÍncia da mesma evidÍncia na
% relaÁ„o neto/2;

+neto( N,A ) :: ( solucoes( (N,A),(neto(N,A)),S ),
comprimento( S,C ), C==1 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o se admitir· a existÍncia de mais do que uma ocorrÍncia da mesma evidÍncia
% na relaÁ„o avÙ/2;

+avo( A,N ) :: ( solucoes( (A,N),(avo(A,N)),S ),
comprimento( S,C ), C==1 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% v. N„o se admitir· a existÍncia de mais do que uma ocorrÍncia da mesma evidÍncia
% na relaÁ„o descendente/3;

+descendente :: ( solucoes(( D,A,_),(descendente( D,A,_)),S ),
comprimento( S,N ), N ==1 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Invariantes Referenciais
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o È admissÌvel existirem mais do que 2 progenitores para um determinado indivÌduo,
% na relaÁ„o filho/2;

+filho( F,P ) :: (solucoes( (Ps),(filho( F,Ps )),S ),
comprimento( S,N ), N =< 2
).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o È admissÌvel existirem mais do que 2 progenitores para um determinado indivÌduo,
% na relaÁ„o pai/2;

+pai( P,F ) :: (findall( (P),(pai( P,F )),S ),
comprimento( S,N ), N =< 2
).
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o poder· acontecer existirem mais do que 4 indivÌduos identificados como ´avÙª na
% relaÁ„o neto/2;

+neto( N,A ) :: ( solucoes( (As),(neto(N,As)),S ),
comprimento( S,C ), C=< 4 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% N„o poder· acontecer existirem mais do que 4 indivÌduos identificados como ´avÙª
% na relaÁ„o avÙ/2;

+avo( A,N ) :: ( solucoes( (As),(avo(As,N)),S ),
comprimento( S,C ), C=< 4 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado que permite a evolucao do conhecimento
% evolucao: Termo -> {V,F}

evolucao( Termo ) :-
solucoes( Invariante,+Termo::Invariante,Lista ),
insercao( Termo ),
teste( Lista ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado insercao: Termo -> {V,F}

insercao( Termo ) :- assert( Termo ).
insercao( Termo ) :- retract( Termo ),!,fail.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens„o do predicado teste: LI -> {V,F}

teste( [] ).
teste( [I|LI] ) :-
I,
teste( LI ).

filho(maria, desconhecido).
nulo(desconhecido).

-filho(F,P):-
nao(filho(F,P)).
excepcao(nao(filho(F,P))).

excepcao(filho(F,P)):-
-filho(F,desconhecido).

+filho(F,P):: (findall(Ps, (filho(maria,Ps), nao(nulo(Ps))),L ), length(L,N), N ==0).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% A identificaÁ„o do ´grauª de descendÍncia na relaÁ„o descendente/3 dever· pertencer
% ao conjunto dos n˙meros naturais
% Extensao do meta-predicado demo: Questao,Resposta -> {V,F}

demo( Questao,verdadeiro ) :-
Questao.
demo( Questao,falso ) :-
-Questao.
demo( Questao,desconhecido ) :-
nao( Questao ),
nao( -Questao ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado nao: Questao -> {V,F}

nao( Questao ) :-
Questao, !, fail.
nao( Questao ).




