%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO - MIEB/4

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SEMANA 08: 03.NOV.2014 - 07.NOV.2014

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Programacao em logica estendida
%
% Representacao de conhecimento imperfeito

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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 formacao/2.
:-dynamic funcao/3.
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do predicado filho: Filho,Pai -> {V,F,D}

filho( joao,jose ).
filho( jose,manuel ).
filho( carlos,jose ).

-filho( F,P ) :-
nao( filho( F,P ) ),
nao( excecao( filho( F,P ) ) ).

% Invariante Estrutural:  nao permitir a insercao de conhecimento
%                         repetido

+filho( F,P ) :: (solucoes( (F,P),(filho( F,P )),S ),
comprimento( S,N ), N == 1
).

% Invariante Referencial: nao admitir mais do que 2 progenitores
%                         para um mesmo individuo

+filho( F,P ) :: (solucoes( (Ps),(filho( F,Ps )),S ),
comprimento( S,N ), N =< 2
).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Explicitacao das situacoes de excecao

% A Belem e' filha de uma pessoa de que se desconhece a identidade

filho( belem,alguem ).
excecao( filho( F,P ) ) :-
filho( F,alguem ).

% A Maria È filha do Faria ou do Garcia

excecao( filho( maria,faria ) ).
excecao( filho( maria,garcia ) ).

% O Julio tem um filho que ninguem pode conhecer

filho( bebe,julio ).
excecao( filho( F,P ) ) :-
filho( bebe,P ).
nulo( bebe ).

+filho( F,P ) :: (solucoes((F1),(filho(F1,julio),nao(nulo(F1))),S ),
comprimento( S,N ), N == 0
).
formacao(david,bacharel).
funcao(david,varredor,500).
formacao(maria, licenciado).

-formacao(N,G):: (findall(N, (funcao(N,P,V)),S), length(S,K), K==0).
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

evolucao( Termo ) :-
solucoes( Invariante,+Termo::Invariante,Lista ),
insercao( Termo ),
teste( Lista ).

demo(L,ou,V):-max(L,V).
demo(L,e,V):-min(L,V).

teste([]).
teste([H|R]):-H,teste(R).

insercao(T):-assert(T).
insercao(T):-retract(T),!,fail.

evolucao(T):-findall(I,+T::I,LI),insercao(T),teste(LI).

remocao(T):-retract(T).
remocao(T):-assert(T),!,fail.

retrocesso(T):-T,findall(I,-T::I,LI),remocao(T),teste(LI).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -

solucoes( X,Y,Z ) :-
findall( X,Y,Z ).

comprimento( S,N ) :-
length( S,N ).
