BASIC APASCALADO V - Uma brisa de Prolog ! (Versão 2)

A linguagem  Prolog  tem sido  usada  para um extenso campo  de aplicações:  
sistemas  dedicados (sistemas  periciais),  compreensão  de  linguagem natural, 
algebra simbólica, escrita de compiladores, desenho arquitectónico, etc.

Apenas os exemplos simples do  uso  de Prolog têm  permanecido  acessiveis  a  pessoas 
 fora  da comunidade Prolog. Actualmente isso não se justifica visto haver
abundantes versões de Prolog para computadores pessoais.

A principal reclamação contra estas linguagens foi que  elas  eram desesperadamente  
ineficientes, e dificeis de controlar.  Essa foi a conclusão das pesquisas nos Estados Unidos.

Mas na Europa, do meio para o fim dos anos 70, David H.D. Warren e seus colegas, desenvolveram
 uma eficiente implementação  de Prolog.  Comparável aos melhores sistemas Lisp disponiveis na altura.

Em Prolog pratica-se a programacao lógica. Normalmente,  formalizar  o  conhecimento  em
lógica é uma estimulante actividade intelectual.

Um programa lógico é um conjunto  de axiomas, ou regras, definindo relações entre objectos.  
Uma computação de um programa lógico é uma  dedução de consequências do programa. 
Um  programa define um conjunto  de  consequências, as  quais  são  o seu significado.
	
Temos,  portanto,  que  o  resultado  de  uma computação de  um programa Prolog é uma 
consequência lógica dos axiomas  nele inseridos.

  programa   = conjunto de axiomas
  computacao = construcao da prova duma questao objectivo do programa.
  Um axioma
	A if B1 and B2 and ... and Bn
    pode ser lido, e executado, como  um procedimento de uma linguagem de programacao recursiva,  
    onde A é a cabeça do procedimento  e os Bi  são o seu corpo.

Aqui estão as 3 declarações básicas num programa prolog:  FACTOS, REGRAS e QUESTÕES.

Um programa lógico  é  um conjunto finito  de cláusulas.  Uma cláusula ou regra  é  uma sentença
lógica universalmente quantificada da forma 
      A  <-  B1, B2, ... , Bk    K>=0
onde A e os Bi são predicados.  Esta sentenca é lida  declarativamente  "A se B1, B2, ...  Bk, 
e é interpretada como:  "para responder à pergunta A, responde a conjunção das perguntas B1, B2,..., Bk".

Uma questão é uma conjunção da forma
		A1, ... , An    n>0
	onde os Ai, são objectos.

Não se surpreendam se não perceberem à primeira. E, se não perceberem à segunda, não se preocupem... 

Moral da história: comprem um PC e dediquem-se à linguagem PASCAL e/ou à linguagem PROLOG.

No próximo  artigo,  e antes  de voltarmos  ao Basic Apascalado, veremos como andam os computadores 
de inteligência.

%----------------------------------------
% FICHEIRO: PARENTES.PL
%----------------------------------------

%------------------------------------------------------------------
% FACTOS/DADOS - Defenição de um universo de factos sobre objectos
%------------------------------------------------------------------

r(gajo,ze).
r(gaja,cm).
r(gaja,catarina).
r(gajo,torgal).
r(gaja,paula).

r(marido,ze,cm).
r(colega,ze,cm).
r(amante,ze,cm).
r(amigo,ze,cm).
r(namorado,ze,cm).

r(pai,ze,torgal).
r(mae,cm,torgal).
r(mae,cm,catarina).
r(irma,catarina,torgal).

r(pai,antonio_magalhaes,cm).
r(mae,teresa_magalhaes,cm).

r(pai,manuel_oliveira,ze).
r(mae,maria_maricato,ze).
r(mae,maria_maricato,paula).

%-------------------------------------------------------------------------------
% REGRAS/RELAÇÕES: definição das relações entre os objectos do universo FAMILIA
%-------------------------------------------------------------------------------

filh(Filh,Pai):-r(pai,Pai,Filh).
filh(Filh,Mae):-r(mae,Mae,Filh).

pai(Pai,Filh):-r(pai,Pai,Filh).
mae(Mae,Filh):-r(mae,Mae,Filh).

gajo(X):- r(gajo,X).
gaja(X):- r(gaja,X).

r(avo,Avo,Net):-
    r(pai,Avo,Filh),
    r(pai,Filh,Net).

r(net,Net,Avo):-
    r(pai,Avo,Filh),
    r(pai,Filh,Net).

r(tio,T,S):-
    r(irmao,T,P),
    r(pai,P,S).
r(tio,T,S):-
    r(irmao,T,M),
    r(mae,M,S).

r(tia,T,S):-
    r(irma,T,P),
    r(pai,P,S).
r(tia,T,S):-
    r(irma,T,M),
    r(mae,M,S).

tio(T,S):- r(tio,T,S).
tia(T,S):- r(tia,T,S).

repelente(X):- r(gajo,X).
repelente(X):- r(gaja,X).

r(irmao,Irmao,Outro):-
        r(mae,Mae,Irmao),
        r(mae,Mae,Outro),
        Irmao \= Outro,
        gajo(Irmao).

r(irma,Irma,Outro):-
        r(mae,Mae,Irma),
        r(mae,Mae,Outro),
        Irma \= Outro,
        gaja(Irma).

irmao(I,X):- r(irmao,I,X).

parentes(Xe,Ps,Rs):-
        r(Rs,Xe,Ps),
        r(Rs,Ps,Xe),
        print(1),
        print([Ps,Rs]),nl,!.
parentes(Xe,Ps,Rs):-
        r(Rs,Xe,Ps),
        print(2),
        print([Ps,Rs]),nl,!.
parentes(Xe,Ps,Rs):-
        r(Rs,Ps,Xe),
        print(3),
        print([Ps,Rs]),nl,!.
p(Xe):-parentes(Xe,Ps,Rs),
        print(4),
        print([Ps,Rs]),nl,!.

%---------------------------------------------------
% QUESTÕES: consulta da base de conhecimento FAMILIA
%---------------------------------------------------

run1:-
    cls,
    wrln('ADIVINHA:'),
    pai(Pai,A),    wrln('Se o pai de A,'),
    filh(Pai,B),   wrln('E'' filho de B,'),
    r(Parentesco,A,B),
    wrln('Qual e'' o parentesco entre A e B?'),
    wrln('prime enter'), rdln(Lx),
    wrln('RESPOSTA: ',Parentesco),
    wrln('EXEMPLO: ',A,' ',Parentesco, ' de ',B).

run2:-
    cls,
    wrln('ADIVINHA:'),
    tia(Tia,Eu), wrln('Eu tenho uma tia,'),
    irmao(IrmaoTia,Tia), wrln('Minha tia tem um irmao,'),
    not(tio(IrmaoTia,Eu)), wrln('Mas, o irmao da minha tia nao e'' meu tio,'),
    r(Parentesco,IrmaoTia,Eu),
    wrln('Qual e'' o parentesco entre IrmaoTia e Eu?'),
    wrln('prime enter'), rdln(Lx),
    wrln('RESPOSTA: ',Parentesco),
    wrln('EXEMPLO: ',IrmaoTia,' ',Parentesco, ' de ',Eu).

run3:-
    cls,
    wrln('ADIVINHA:'),
    pai(MeuPai,Eu), wrln('Eu tenho um pai,'),
    pai(PaiY,Y), wrln('Y tambem tem um pai,'),
    filh(PaiY,MeuPai), wrln('O pai de Y e'' filho do meu pai,'),
    not(r(irmao,I,Eu)), wrln('Eu nao tenho irmaos,'),
    r(Parentesco,Eu,Y),
    wrln('Qual e'' o parentesco entre Eu e Y?'),
    wrln('prime enter'), rdln(Lx),
    wrln('RESPOSTA: ',Parentesco),
    wrln('EXEMPLO: ',Eu,' ',Parentesco, ' de ',Y).

run4:-
    cls,
    wrln('ADIVINHA:'),
    filh(Tu,Eu),        wrln('Tu es meu filho'),
    pai(Pai,Tu),        wrln('Tu tens um pai'),
    Eu \= Pai,          wrln('Mas eu nao sou teu pai'),
    r(Parentesco,Eu,Tu),wrln('Quem sou eu?'),
    wrln('Qual e'' o meu parentesco contigo?'),
    wrln('prime enter'), rdln(Lx),
    wrln('RESPOSTA: ',Parentesco),
    wrln('EXEMPLO: ',Eu,' ',Parentesco, ' de ',Tu).


%-------------------------------
% EXEMPLOS: Exemplos de execução
%-------------------------------

%--------------------------------------------------------------------------------
% Se o pai do Jorge, é filho do João, qual é o parentesco entre o Jorge e o João?
%--------------------------------------------------------------------------------
| ?- run1.
ADIVINHA:
Se o pai de A,
E' filho de B,
Qual e' o parentesco entre A e B?
prime enter
|:
RESPOSTA: net
EXEMPLO: torgal net de manuel_oliveira

yes
| ?-



%---------------------------------------------------------------------------
% Se o irmão da minha tia nao é meu tio, qual é o parentesco entre eu e ele?
%---------------------------------------------------------------------------
| ?- run2.
ADIVINHA:
Eu tenho uma tia,
Minha tia tem um irmao,
Mas, o irmao da minha tia nao e' meu tio,
Qual e' o parentesco entre IrmaoTia e Eu?
prime enter
|:
RESPOSTA: pai
EXEMPLO: ze pai de torgal

yes
| ?-



%----------------------------------------------------------------------------------------------------
% Se O pai do Jorge é filho do meu pai e eu não tenho irmãos, qual é o parentesco entre eu e o Jorge?
%----------------------------------------------------------------------------------------------------
| ?- run3.
ADIVINHA:
Eu tenho um pai,
Y tambem tem um pai,
Y tambem tem um pai,
Y tambem tem um pai,
Eu tenho um pai,
Y tambem tem um pai,
Y tambem tem um pai,
Y tambem tem um pai,
Eu tenho um pai,
Y tambem tem um pai,
O pai de Y e' filho do meu pai,
Eu nao tenho irmaos,
Qual e' o parentesco entre Eu e Y?
prime enter
|:
RESPOSTA: pai
EXEMPLO: ze pai de torgal

yes
| ?-


%----------------------------------------------------------------------------------------------------
% Tu es meu filho, mas eu não sou teu pai. Quem sou eu?
%----------------------------------------------------------------------------------------------------
| ?- run4.
ADIVINHA:
Tu es meu filho
Tu tens um pai
Tu es meu filho
Tu tens um pai
Tu es meu filho
Tu tens um pai
Tu es meu filho
Tu tens um pai
Mas eu nao sou teu pai
Quem sou eu?
Qual e' o meu parentesco contigo?
prime enter
|:
RESPOSTA: mae
EXEMPLO: cm mae de torgal

yes
| ?-




-----------------------------
ZE OLIVEIRA zarsoft(a)clix.pt
-----------------------------