Programação lógica

PrologEdit

artigo principal: Prolog

o Prolog da linguagem de programação foi desenvolvido em 1972 por Alain Colmerauer. Surgiu de uma colaboração entre Colmerauer em Marselha e Robert Kowalski em Edimburgo. Colmerauer estava trabalhando na compreensão da linguagem natural, usando lógica para representar semântica e usando resolução para responder perguntas. Durante o verão de 1971, Colmerauer e Kowalski descobriram que a forma clausal da lógica poderia ser usada para representar gramáticas formais e que os provadores de teorema de resolução poderiam ser usados para analisar. They observed that some theorem provers, like hyper-resolution, behave as bottom-up parsers and others, like SL-resolution (1971), behave as top-down parsers.foi no verão seguinte de 1972 que Kowalski, novamente trabalhando com Colmerauer, desenvolveu a interpretação processual das implicações. Esta dupla interpretação declarativa / processual mais tarde foi formalizada na notação Prolog

H: – B1,…, Bn.

que pode ser lido (e usado) tanto declarativamente quanto proceduralmente. Tornou-se também claro que tais cláusulas poderiam ser restringidas a cláusulas definidas ou cláusulas de buzina, onde H, B1, …, Bn são todas fórmulas lógicas de predicados atômicos, e que a resolução SL poderia ser restrita (e generalizada) à resolução exuberante ou DLV. A interpretação processual de Kowalski e LUSH foram descritas em um memorando de 1973, publicado em 1974.

Colmerauer, com Philippe Roussel, usou esta interpretação dupla de cláusulas como base do Prolog, que foi implementado no verão e outono de 1972. O primeiro programa Prolog, também escrito em 1972 e implementado em Marselha, foi um sistema francês de resposta a perguntas. O uso do Prolog como linguagem de programação prática foi dado grande impulso pelo desenvolvimento de um compilador por David Warren em Edimburgo em 1977. Experiments demonstrated that Edinburgh Prolog could competite with the processing speed of other symbolic programming languages such as Lisp. Edinburgh Prolog tornou-se o padrão de facto e influenciou fortemente a definição da norma ISO Prolog.

Programa de programação lógica Abdutiva

programação lógica Abdutiva é uma extensão da programação lógica normal que permite que alguns predicados, declarados como predicados abduzíveis, sejam “abertos” ou indefinidos. A clause in an abductive logic program has the form:

H: – B1,…, Bn, A1,…, An.

, onde H é uma fórmula atômica que não é abducible, todos os Bi são literais, cujos predicados não são abducible, e Ai são fórmulas atômicas cujos predicados são abducible. Os predicados abduzíveis podem ser restringidos por restrições de integridade, que podem ter a forma:

falso: – L1,…, Ln.

onde os Li são literais arbitrários (definidos ou abduzíveis, e atômicos ou negados). Por exemplo:

canfly(X) :- bird(X), normal(X).false :- normal(X), wounded(X).bird(john).bird(mary).wounded(john).

onde o predicado normal é abduzível.a resolução de problemas é alcançada pela derivação de hipóteses expressas em termos de predicados abduzíveis como soluções de problemas a serem resolvidos. Estes problemas podem ser observações que precisam ser explicadas (como no raciocínio abdutivo clássico) ou objetivos a serem resolvidos (como na programação lógica normal). Por exemplo, a hipótese normal(mary) explica a observação canfly(mary). Além disso, a mesma hipótese implica a única solução X = maria do objetivo de encontrar algo que pode voar:

:- canfly(X).

lógica Abdutiva de programação tenha sido utilizada para o diagnóstico de falhas, planejamento, processamento de linguagem natural e aprendizado de máquina. Também tem sido usado para interpretar a negação como falha como uma forma de raciocínio abdutivo.

Metalogic programmingEdit

Devido a lógica matemática tem uma longa tradição de distinguir entre o objeto de linguagem e metalinguagem, lógica de programação também permite metalevel de programação. O mais simples metalogic programa é o chamado “baunilha” meta-interpretador:

 solve(true). solve((A,B)):- solve(A),solve(B). solve(A):- clause(A,B),solve(B).

, onde o verdadeiro representa um conjunto vazio, e cláusula(A,B) significa que não é um objeto de nível cláusula da formA :- B.

Metalogic de programação permite que o nível de objeto e metalevel representações a serem combinadas, como em linguagem natural. Ele também pode ser usado para implementar qualquer lógica que é especificada como regras de inferência. Metalogic é usado na programação lógica para implementar metaprogramas, que manipulam outros programas, bases de dados, bases de conhecimento ou teorias axiomáticas como dados.

Constraint logic programmingEdit

Main article: Constraint logic programming

Constraint logic programming combines Horn clause logic programming with constraint solving. Estende as cláusulas de Chifre, permitindo que alguns predicados, declarados como predicados de restrição, ocorram como literais no corpo das cláusulas. Um programa lógico de restrição é um conjunto de cláusulas da forma:

H :- C1, …, Cn ◊ B1, …, Bn.

Onde H E todo o Bi são fórmulas atômicas, e o Ci são restrições. Declarativamente, tais cláusulas são interpretadas como implicações lógicas ordinárias:

H se C1 E … E Cn E B1 e … E Bn.

no entanto, enquanto os predicados nas cabeças das cláusulas são definidos pelo Programa de lógica de restrição, os predicados nas restrições são predefinidos por alguma estrutura ou teoria modelo-teórica específica do domínio.

Processualmente, subgoals cujos predicados são definidos pelo programa são resolvidos por objetivo a redução normal de lógica de programação, mas as restrições são verificadas para satisfiability, através de um domínio específico de restrição-solver, que implementa a semântica de restrição de predicados. Um problema inicial é resolvido reduzindo-o a uma conjunção satisfatível de restrições.

o seguinte programa de restrição lógica representa um banco de dados Temporal de brinquedo da história de john como um professor:

teaches(john, hardware, T) :- 1990 ≤ T, T < 1999.teaches(john, software, T) :- 1999 ≤ T, T < 2005.teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012.rank(john, instructor, T) :- 1990 ≤ T, T < 2010.rank(john, professor, T) :- 2010 ≤ T, T < 2014.

Aqui ≤ e< são predicados de restrições, com a sua semântica habitual. A seguinte cláusula de objetivo questiona o banco de dados para descobrir quando john ensinou lógica e era um professor:

:- ensina(john, lógica, T), rank(john, professor, T).

a solução é 2010 ≤ T, T ≤ 2012.

programação lógica de restrições tem sido usado para resolver problemas em áreas como Engenharia civil, Engenharia Mecânica, verificação de circuitos digitais, horários automatizados, controle de tráfego aéreo e finanças. Está intimamente relacionado com a programação lógica abdutiva.

simultaneous logic programmingEdit

Main article: Concurrent logic programming

Concurrent logic programming integrates concepts of logic programming with concurrent programming. Seu desenvolvimento foi dado um grande impulso na década de 1980 por sua escolha para a linguagem de programação de sistemas do projeto japonês de quinta geração (FGCS).

UM programa lógico concorrente é um conjunto de cláusulas de chifres vigiadas da forma:

H: – G1,…, Gn / B1,…, Bn.

a conjunção G1,… , Gn é chamado de guarda da cláusula, e / é o operador de compromisso. Declarativamente, as cláusulas de buzina vigiadas são lidas como implicações lógicas ordinárias:

H se G1 e … e Gn E B1 e … E Bn.

no entanto, em termos processuais, quando existem várias cláusulas cujas cabeças h correspondem a um determinado objectivo, então todas as cláusulas são executadas em paralelo, verificando se os seus guardas G1, … , GN hold. Se os guardas de mais de uma cláusula detêm, então uma escolha comprometida é feita para uma das cláusulas, e a execução prossegue com os subtítulos B1,…, Bn da cláusula escolhida. Estes subtítulos também podem ser executados em paralelo. Assim, a programação lógica simultânea implementa uma forma de” não se importa com o não-determinismo”, ao invés de”não se sabe o não-determinismo”.

Por exemplo, o seguinte programa lógico concorrente define um Shuffle de predicados ( Esquerda, Direita, junção), que pode ser usado para baralhar duas listas esquerda e direita, combinando-as em uma única junção de listas que preserva a ordenação das duas listas esquerda e direita:

shuffle(, , ).shuffle(Left, Right, Merge) :- Left = | Merge = , shuffle(Rest, Right, ShortMerge).shuffle(Left, Right, Merge) :- Right = | Merge = , shuffle(Left, Rest, ShortMerge).

Aqui, representa a lista vazia, e representa uma lista com a cabeça do primeiro elemento seguida pela cauda da lista, como no Prolog. (Note que a primeira ocorrência de | na segunda e terceira cláusulas é o construtor da lista, enquanto a segunda ocorrência de | é o operador do COMPROMISSO.) O programa pode ser usado, por exemplo, para embaralhar a lista e invocando o objetivo da cláusula:

shuffle(, , Merge).

O programa irá não-determinística gerar uma única solução, por exemplo Merge = .

Arguably, concurrent logic programming is based on message passing, so it is subject to the same indeterminacy as other concurrent message-passing systems, such as Actors (see Indeterminacy in concurrent computation). Carl Hewitt argumentou que programação lógica concorrente não é baseada na lógica em seu sentido que os passos computacionais não podem ser deduzidos logicamente. No entanto, na programação lógica concorrente, qualquer resultado de uma computação terminante é uma consequência lógica do programa, e qualquer resultado parcial de uma computação parcial é uma consequência lógica do programa e do objetivo residual (rede de processos). Assim, a indeterminação de computações implica que nem todas as consequências lógicas do programa podem ser deduzidas.

simultaneous constraint logic programmingEdit

Main article: Programação lógica de restrição concorrente

programação lógica de restrição concorrente combina programação lógica concorrente e programação lógica de restrição, usando restrições para controlar a concorrência. Uma cláusula pode conter uma guarda, que é um conjunto de restrições que podem bloquear a aplicabilidade da cláusula. Quando os guardas de várias cláusulas são satisfeitos, programação lógica de restrição concorrente faz uma escolha comprometida de usar apenas um.

Indutive logic programmingEdit

artigo principal: Programação lógica indutiva

programação lógica indutiva está preocupada com a generalização de exemplos positivos e negativos no contexto do conhecimento de fundo: aprendizagem de máquina de programas lógicos. O trabalho recente nesta área, combinando programação lógica, aprendizagem e probabilidade, deu origem ao novo campo de aprendizagem relacional estatística e programação lógica indutiva probabilística.

Higher-order logic programmingEdit

vários pesquisadores estenderam a programação lógica com características de programação de ordem superior derivadas da lógica de ordem superior, tais como variáveis de predicados. Tais linguagens incluem as extensões do Prolog HiLog e λProlog.

Linear logic programmingEdit

Basing logic programming within linear logic has resulted in the design of logic programming languages which are considerably more expressive than those based on classical logic. Os programas de cláusula de Horn só podem representar a mudança de Estado pela mudança de argumentos para predicados. Na programação lógica linear, pode-se usar a lógica linear ambiente para suportar a mudança de Estado. Alguns projetos iniciais de linguagens de programação lógica baseadas na lógica linear incluem LO, Lolli, ACL e Forum . Forum provides a goal-directed interpretation of all of linear logic.

Object-oriented logic programmingEdit

f-logic extends logic programming with objects and the frame syntax.

Logtalk estende a linguagem de programação Prolog com suporte para objetos, protocolos e outros conceitos OOP. Ele suporta a maioria dos sistemas Prolog compatíveis com padrão como compiladores backend.

Transaction logic programmingEdit

Transaction logic is an extension of logic programming with a logical theory of state-modificing updates. Tem uma semântica modelo-teórica e uma semântica processual. Uma implementação de um subconjunto da lógica de transação está disponível no sistema Flora-2. Outros protótipos também estão disponíveis.

Deixe uma resposta

O seu endereço de email não será publicado.