Programação lógica é um tipo de programação a qual utiliza uso de lógica matemática em sua essência. As linguagens de programação lógicas ou linguagens declarativas, são bem diferentes das outras tanto a sua semântica qual a sua sintaxe. Por exemplo na programação imperativa, nós descrevemos um procedimento para que assim sair um resultado a partir dele, na lógica, nós descrevemos o resultado para assim obte-lô.
Para que possamos entender a programação lógica devemos entender primeiro a sua base, a lógica formal. Uma preposição pode ser entendida com uma instrução lógica, que pode ser verdadeira, ou pode ser falsa. A lógica formal foi criada para permitir a descrições de preposições, para que fossem verificada a validade de suas declarações. Para que possamos utilizar características básicas da lógica formal, usamos a lógica simbólica, que nos permite: expressar preposições, expressar qual relação há entre elas, permitindo assim que sejam presumidas outras preposições. Prolog é a única linguagem de programação para uso generalizado, pois isso é que vamos trata-lá nesse blog.
Para que possamos entender a programação lógica devemos entender primeiro a sua base, a lógica formal. Uma preposição pode ser entendida com uma instrução lógica, que pode ser verdadeira, ou pode ser falsa. A lógica formal foi criada para permitir a descrições de preposições, para que fossem verificada a validade de suas declarações. Para que possamos utilizar características básicas da lógica formal, usamos a lógica simbólica, que nos permite: expressar preposições, expressar qual relação há entre elas, permitindo assim que sejam presumidas outras preposições. Prolog é a única linguagem de programação para uso generalizado, pois isso é que vamos trata-lá nesse blog.
Alain Colmerauer
reponsável pela criação do PROLOG
PROLOG foi uma linguagem criada em 1972, na Universidade de Marseille, França. É muita utilizada nas mais diversas aplicações como: banco de dados relacionais, compreensão de linguagens naturais entre outras aplicações. Ao contrário da maior parte das linguagens, PROLOG não possui instruções de controle, (if, else, while), ao invés disso utilizamos métodos lógicas para atingir um objetivo. Os tipos de dados presentes em outros linguagens, não são servem para linguagens lógicas ao invés disso, utiliza-se um termo, que pode ser uma constante uma variável ou um termo composto. Nas próximas linhas nos aprofundaremos nessa fascinante, linguagem, que é o expoente máximo do paradigma da programação lógica.
Fatos
O fato é formado por um predicado, seus objetos (argumentos) e, ao fim da instrução colocamos um ponto (.) semelhante ao ; das outras linguagens. Veja o exemplo:
predicado (argumento1, argumento2).
predicado (argumento1, argumento2).
O predicado indica qual a relação em que os objetos irão interagir. Ex: amigo (Pedro, augusto).
Definimos que há uma amizade entre os objetos Pedro e augusto.
Ex: spike (dog).
Repare que ao colocar apenas um objeto, o predicado passa a ser uma característica do objeto. Importante reparar que o nome dos predicados e dos objetos devem começar com letra minúscula, primeiro vem o primeiro depois os objetos separados por virgula, e entre parênteses. A ordem dos objetivos pode alterar o resultado.
Definimos que há uma amizade entre os objetos Pedro e augusto.
Ex: spike (dog).
Repare que ao colocar apenas um objeto, o predicado passa a ser uma característica do objeto. Importante reparar que o nome dos predicados e dos objetos devem começar com letra minúscula, primeiro vem o primeiro depois os objetos separados por virgula, e entre parênteses. A ordem dos objetivos pode alterar o resultado.
Questão
As questões são basicamente escritas da mesma maneira que os fatos, sendo diferenciada pelo seu interpretador, mas que em geral vem com uma interrogação na frente:
?-irmao (josé,joão).
Ao se fazer uma questão no PROLOG, ele procura em sua base de dados, se há algum fato que coincide com a questão, se existir, ele retorna um YES. Caso contrário ele retorna um NO.
?-irmao (josé,joão).
Ao se fazer uma questão no PROLOG, ele procura em sua base de dados, se há algum fato que coincide com a questão, se existir, ele retorna um YES. Caso contrário ele retorna um NO.
Variáveis
As variáveis no PROLOG, são um pouco diferentes do que nas outras linguagens. No começo ela é uma incógnita, que pode está ou não instanciada. Quando ela assume o valor do objeto ela está instanciada, caso contrário não.
Exemplo da seguinte base de conhecimento a seguir:
ama (maria, joão).
ama (bernadete, eduardo).
ama (ricardo, lucia).
Ao se fazer a seguinte questão, o que acontecerá?
?- ama (maria, X).
Inicialmente a variável X, está não-instanciada, mas logo em seguida, o PROLOG faz uma busca na sua base de conhecimento por um fato que seja idêntico a questão, ou seja, que tenho o mesma predicado o mesmo número de argumentos, e que o primeiro argumento seja “maria”. Quando o PROLOG encontrar o primeiro fato, checa se os requisitos foram cumpridos, e instância a variável X com o objeto “joão”.
Exemplo da seguinte base de conhecimento a seguir:
ama (maria, joão).
ama (bernadete, eduardo).
ama (ricardo, lucia).
Ao se fazer a seguinte questão, o que acontecerá?
?- ama (maria, X).
Inicialmente a variável X, está não-instanciada, mas logo em seguida, o PROLOG faz uma busca na sua base de conhecimento por um fato que seja idêntico a questão, ou seja, que tenho o mesma predicado o mesmo número de argumentos, e que o primeiro argumento seja “maria”. Quando o PROLOG encontrar o primeiro fato, checa se os requisitos foram cumpridos, e instância a variável X com o objeto “joão”.
Conjunção e Disjunção
Para que possamos formar uma lógica mais específica nas questões, utilizamos o conceito de conjunção e disjunção. Elas equivalem ao AND(E) e OR(OU), das outras linguagens de programação. Separando os fatos por vírgula, caso seja um AND, ou por ponto-vírgula caso seja um OR.Por exemplo:
irmão (josé, joão).
irmão (paulo,joão).
Podemos realizar a seguinte questão:
?- irmão(josé,X),irmão(paulo,X).
No exemplo acima, colocamos dois fatos e fazemos um cruzamento entre eles. Como joão é irmão de josé e paulo, a variável X receberá o objeto josé retornará um YES.
irmão (josé, joão).
irmão (paulo,joão).
Podemos realizar a seguinte questão:
?- irmão(josé,X),irmão(paulo,X).
No exemplo acima, colocamos dois fatos e fazemos um cruzamento entre eles. Como joão é irmão de josé e paulo, a variável X receberá o objeto josé retornará um YES.
Regras
Agora chegamos a parte, que pode se dizer, que é a mais interessante do PROLOG, onde ele mostra todo o seu poder. As regras as quais podem ser utilizadas para construir relações entre os fatos, caso haja alguma ligação entre eles. São utilizadas para formar questões complexas que especificam situações que podem ser verdadeiras, caso algumas condições sejam verdadeiras.
Para que possamos usar uma regas, utilizamos o símbolo “:-“ que significa uma condição (se). Exemplo abaixo:
Dados os fatos:
pai(arthur,silvio).
pai(arthur,carlos).
pai(carlos,xico).
pai(silvio,ricardo).
fonte:http://www.linhadecodigo.com.br/artigo/1697/descobrindo-o-prolog.aspx
Vamos usar a regra:
avo(X,Z) :- pai(X,Y), pai(Y,Z).
A regra acima quer dizer que, se alguém for pai de uma pessoa, que é pai de outra pessoa, então ele será o seu avô. Realizaremos uma consulta para verificar a regra:
?- avo(arthur,xico),avo(arthur,ricardo).
Retornará um: "YES"
Exemplificando, "arthur" é avô de "xico" e "ricardo", pois "arthur" é pai de "silvio" e "carlos", que também são pais de "xico" e "ricardo".
Para que possamos usar uma regas, utilizamos o símbolo “:-“ que significa uma condição (se). Exemplo abaixo:
Dados os fatos:
pai(arthur,silvio).
pai(arthur,carlos).
pai(carlos,xico).
pai(silvio,ricardo).
fonte:http://www.linhadecodigo.com.br/artigo/1697/descobrindo-o-prolog.aspx
Vamos usar a regra:
avo(X,Z) :- pai(X,Y), pai(Y,Z).
A regra acima quer dizer que, se alguém for pai de uma pessoa, que é pai de outra pessoa, então ele será o seu avô. Realizaremos uma consulta para verificar a regra:
?- avo(arthur,xico),avo(arthur,ricardo).
Retornará um: "YES"
Exemplificando, "arthur" é avô de "xico" e "ricardo", pois "arthur" é pai de "silvio" e "carlos", que também são pais de "xico" e "ricardo".
Entrada e saída
Como em outras linguagens o PROLOG, possui outras opções de saída além do YES ou NO, entre elas está o write() e o read()
write()- usamos para escrever uma mensagem no dispositivo de saída.
read() – utilizamos para ler uma mensagem no dispositivo de entrada.
Vamos ver um pequeno exemplo:
ola :- read(X), write('Bem_Vindo '), write(X).
Ao chamarmos
?- Bem_Vindo. 'Lúcio'.
Repare que não há nenhum parâmetro na regra, então apenas colocamos o seu nome sem atributos, após isso, o dado é lido pelo comando read(X).
write()- usamos para escrever uma mensagem no dispositivo de saída.
read() – utilizamos para ler uma mensagem no dispositivo de entrada.
Vamos ver um pequeno exemplo:
ola :- read(X), write('Bem_Vindo '), write(X).
Ao chamarmos
?- Bem_Vindo. 'Lúcio'.
Repare que não há nenhum parâmetro na regra, então apenas colocamos o seu nome sem atributos, após isso, o dado é lido pelo comando read(X).
Conclusão
O paradigma das linguagens lógicas, é bem diferente de outras linguagens de programação, mas onde as outras deixam a desejar, como na inteligência artificial, elas reinam em absoluto. O que foi escrito aqui, diz respeito as funções básicas da linguagem, mas ela possui muito mais recursos, se você estiver curioso recomendamos:
ROBINSON, P. R. Turbo Prolog: Guia do Usuário. São Paulo, McGraw-Hill, 1988.
CLOCKSIN, W. F.; MELLISH, C. S. Programming in Prolog. 2a. ed., Berlin, Springer-Verlag, 1984.
REFERÊNCIAS
Descobrindo o PROLOG. Disponível em Acessado em 10/06/2010 http://www.linhadecodigo.com.br/artigo/1697/descobrindo-o-rolog.aspx
PROLOG, Wikipédia - Enciclopédia livre. Disponível em: http://pt.wikipedia.org/wiki/Prolog. Acesso em: 10/06/2010
ROBINSON, P. R. Turbo Prolog: Guia do Usuário. São Paulo, McGraw-Hill, 1988.
CLOCKSIN, W. F.; MELLISH, C. S. Programming in Prolog. 2a. ed., Berlin, Springer-Verlag, 1984.
REFERÊNCIAS
Descobrindo o PROLOG. Disponível em Acessado em 10/06/2010 http://www.linhadecodigo.com.br/artigo/1697/descobrindo-o-rolog.aspx
PROLOG, Wikipédia - Enciclopédia livre. Disponível em: http://pt.wikipedia.org/wiki/Prolog. Acesso em: 10/06/2010