Programação lógica

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

A programação lógica é um paradigma de programação que é amplamente baseado na lógica formal . Qualquer programa escrito em uma linguagem de programação lógica é um conjunto de sentenças em forma lógica, expressando fatos e regras sobre algum domínio do problema. As principais famílias de linguagens de programação lógica incluem Prolog , programação de conjunto de respostas (ASP) e Datalog . Em todas essas linguagens, as regras são escritas na forma de cláusulas :

H :- B1, …, Bn.

e são lidos declarativamente como implicações lógicas:

H if B1 and … and Bn.

Hé chamado de cabeça da regra e , ..., é chamado de corpo . Fatos são regras que não têm corpo, e são escritas na forma simplificada: B1Bn

H.

No caso mais simples em que H, , ..., são todas fórmulas atômicas , essas cláusulas são chamadas de cláusulas definidas ou cláusulas de Horn . No entanto, existem muitas extensões desse caso simples, sendo a mais importante o caso em que as condições no corpo de uma cláusula também podem ser negações de fórmulas atômicas. As linguagens de programação de lógica que incluem essa extensão têm os recursos de representação de conhecimento de uma lógica não monotônica . B1Bn

Em ASP e Datalog, os programas lógicos possuem apenas uma leitura declarativa , e sua execução é realizada por meio de um procedimento de prova ou gerador de modelo cujo comportamento não deve ser controlado pelo programador. No entanto, na família de linguagens Prolog, os programas lógicos também têm uma interpretação procedural como procedimentos de redução de metas:

para resolver H, resolver e ... e resolver .B1Bn

Considere a seguinte cláusula como exemplo:

fallible(X) :- human(X).

baseado em um exemplo usado por Terry Winograd [1] para ilustrar a linguagem de programação Planner . Como uma cláusula em um programa lógico, ela pode ser usada tanto como um procedimento para testar se Xé fallibletestando se Xé human, quanto como um procedimento para encontrar um Xque é fallibleencontrando um Xque é human. Até os fatos têm uma interpretação processual. Por exemplo, a cláusula:

human(socrates).

pode ser usado tanto como um procedimento para mostrar que socratesé human, quanto como um procedimento para encontrar um Xque é human"atribuindo" socratesa X.

A leitura declarativa de programas lógicos pode ser usada por um programador para verificar sua correção. Além disso, técnicas de transformação de programas baseados em lógica também podem ser usadas para transformar programas lógicos em programas logicamente equivalentes que são mais eficientes. Na família Prolog de linguagens de programação lógica, o programador também pode usar o comportamento conhecido de resolução de problemas do mecanismo de execução para melhorar a eficiência dos programas.

História

O uso da lógica matemática para representar e executar programas de computador também é uma característica do cálculo lambda , desenvolvido por Alonzo Church na década de 1930. No entanto, a primeira proposta de usar a forma clausal da lógica para representar programas de computador foi feita por Cordell Green . [2] Este usou uma axiomatização de um subconjunto de LISP , juntamente com uma representação de uma relação de entrada-saída, para calcular a relação simulando a execução do programa em LISP. Absys de Foster e Elcock, por outro lado, empregou uma combinação de equações e cálculo lambda em uma linguagem de programação assertiva que não impõe restrições à ordem em que as operações são executadas. [3]

A programação lógica em sua forma atual pode ser rastreada até os debates no final dos anos 1960 e início dos anos 1970 sobre representações declarativas versus procedimentais do conhecimento em inteligência artificial . Os defensores das representações declarativas estavam trabalhando notavelmente em Stanford , associados a John McCarthy , Bertram Raphael e Cordell Green, e em Edimburgo , com John Alan Robinson (um visitante acadêmico da Syracuse University ), Pat Hayes e Robert Kowalski . Os defensores das representações procedimentais concentravam-se principalmente no MIT , sob a liderança de Marvin Minsky .e Seymour Papert . [ citação necessária ]

Apesar de se basear nos métodos de prova da lógica, o Planner , desenvolvido no MIT, foi a primeira linguagem a surgir dentro desse paradigma procedimentalista. [4] O planejador apresentou invocação direcionada a padrões de planos processuais a partir de metas (ou seja, redução de metas ou encadeamento reverso ) e de asserções (ou seja , encadeamento direto ). A implementação mais influente do Planner foi o subconjunto do Planner, chamado Micro-Planner, implementado por Gerry Sussman , Eugene Charniak e Terry Winograd . Ele foi usado para implementar o programa de compreensão de linguagem natural de Winograd, SHRDLU , que foi um marco na época. [1]Para lidar com os sistemas de memória muito limitados da época, Planner usou uma estrutura de controle de retrocesso para que apenas um caminho de computação possível tivesse que ser armazenado por vez. O Planner deu origem às linguagens de programação QA-4, Popler, Conniver, QLISP e a linguagem concorrente Ether. [ citação necessária ]

Hayes e Kowalski em Edimburgo tentaram reconciliar a abordagem declarativa baseada em lógica para a representação do conhecimento com a abordagem procedural de Planner. Hayes (1973) desenvolveu uma linguagem equacional, Golux, na qual diferentes procedimentos poderiam ser obtidos alterando o comportamento do provador de teoremas. [5] Kowalski, por outro lado, desenvolveu a resolução SLD , [6] uma variante da resolução SL, [7] e mostrou como ela trata as implicações como procedimentos de redução de metas. Kowalski colaborou com Colmerauer em Marselha, que desenvolveu essas ideias no projeto e implementação da linguagem de programação Prolog .

A Association for Logic Programming foi fundada para promover a Programação Lógica em 1986.

Prolog deu origem às linguagens de programação ALF , Fril , Gödel , Mercury , Oz , Ciao , Visual Prolog , XSB e λProlog , bem como uma variedade de linguagens de programação de lógica concorrente , [8] linguagens de programação de lógica de restrição e Datalog . [9]

Conceitos

Semântica

Maarten van Emden e Robert Kowalski definiram três semânticas para programas de lógica de cláusula de Horn, modelo-teórico , ponto fixo e prova-teórico , e mostraram que eles são equivalentes. [10]

Lógica e controle

A programação lógica pode ser vista como dedução controlada. Um conceito importante na programação lógica é a separação dos programas em seu componente lógico e seu componente de controle. Com linguagens de programação de lógica pura, o componente lógico sozinho determina as soluções produzidas. O componente de controle pode ser variado para fornecer formas alternativas de executar um programa lógico. Essa noção é capturada pelo slogan

Algoritmo = Lógica + Controle

onde "Logic" representa um programa lógico e "Control" representa diferentes estratégias de prova de teoremas. [11]

Resolução de problemas

No caso simplificado e proposicional em que um programa lógico e um objetivo atômico de nível superior não contêm variáveis, o raciocínio reverso determina uma árvore e-ou , que constitui o espaço de busca para resolver o objetivo. O objetivo de nível superior é a raiz da árvore. Dado qualquer nó na árvore e qualquer cláusula cuja cabeça corresponda ao nó, existe um conjunto de nós filhos correspondentes aos sub-objetivos no corpo da cláusula. Esses nós filhos são agrupados por um "e". Os conjuntos alternativos de filhos correspondentes a formas alternativas de resolver o nó são agrupados por um "ou".

Qualquer estratégia de busca pode ser usada para buscar neste espaço. O Prolog usa uma estratégia de retrocesso sequencial, last-in-first-out, na qual apenas uma alternativa e um sub-objetivo são considerados por vez. Outras estratégias de busca, como busca paralela, retrocesso inteligente ou busca do melhor primeiro para encontrar uma solução ótima, também são possíveis.

No caso mais geral, onde os sub-objetivos compartilham variáveis, outras estratégias podem ser usadas, como escolher o sub-objetivo mais instanciado ou suficientemente instanciado para que apenas um procedimento se aplique. Tais estratégias são utilizadas, por exemplo, em programação lógica concorrente .

Negação como falha

Para a maioria das aplicações práticas, bem como para aplicações que requerem raciocínio não monotônico em inteligência artificial, os programas lógicos da cláusula de Horn precisam ser estendidos para programas lógicos normais, com condições negativas. Uma cláusula em um programa lógico normal tem a forma:

H :- A1, …, An, not B1, …, not Bn.

e é lido declarativamente como uma implicação lógica:

H if A1 and … and An and not B1 and … and not Bn.

onde He todos os e são fórmulas atômicas. A negação nos literais negativos é comumente chamada de " negação como falha ", porque na maioria das implementações, uma condição negativa é mantida, mostrando que a condição positiva falha. Por exemplo: AiBi not Bi not Bi Bi

canfly ( X )  :-  pássaro ( X ),  não  anormal ( X ). 
anormal ( X )  :-  ferido ( X ). 
pássaro ( joão ). 
pássaro ( maria ). 
ferido ( João ).

Dado o objetivo de encontrar algo que possa voar:

:-  mosca ( X ).

existem duas soluções candidatas, que resolvem o primeiro subobjetivo bird(X), a saber X = johne X = mary. O segundo subobjetivo not abnormal(john)da primeira solução candidata falha, porque wounded(john)é bem-sucedido e, portanto, é bem- abnormal(john)sucedido. No entanto, o segundo subobjetivo not abnormal(mary)da segunda solução candidata é bem-sucedido, porque wounded(mary)falha e, portanto, abnormal(mary)falha. Portanto, X = maryé a única solução para o objetivo.

O Micro-Planner tinha uma construção, chamada "thnot", que quando aplicada a uma expressão retorna o valor true se (e somente se) a avaliação da expressão falhar. Um operador equivalente normalmente existe nas implementações modernas do Prolog . Normalmente é escrito como ou , onde é algum objetivo (proposição) a ser provado pelo programa. Esse operador difere da negação na lógica de primeira ordem: uma negação como falha quando a variável foi vinculada ao átomo , mas é bem-sucedida em todos os outros casos, inclusive quando não está vinculada. Isso torna o raciocínio do Prolog não monotônico : sempre falha, enquanto pode ter sucesso, vinculando -se anot(Goal)\+ GoalGoal\+ X == 1X1XX = 1, \+ X == 1\+ X == 1, X = 1X1, dependendo se Xfoi inicialmente vinculado (observe que o Prolog padrão executa os objetivos na ordem da esquerda para a direita).

O status lógico da negação como falha não foi resolvido até que Keith Clark [1978] mostrou que, sob certas condições naturais, é uma implementação correta (e às vezes completa) da negação clássica com relação à conclusão do programa. A conclusão equivale aproximadamente a considerar o conjunto de todas as cláusulas do programa com o mesmo predicado do lado esquerdo, digamos

H :- Body1.
H :- Bodyk.

como definição do predicado

H iff (Body1 or … or Bodyk)

onde "iff" significa "se e somente se". Escrever a conclusão também requer o uso explícito do predicado de igualdade e a inclusão de um conjunto de axiomas apropriados para igualdade. No entanto, a implementação da negação como falha precisa apenas das metades if das definições sem os axiomas da igualdade.

Por exemplo, a conclusão do programa acima é:

canfly(X) iff bird(X), not abnormal(X).
abnormal(X) iff wounded(X).
bird(X) iff X = john or X = mary.
X = X.
not john = mary.
not mary = john.

A noção de completude está intimamente relacionada à semântica de circunscrição de McCarthy para o raciocínio padrão e à suposição de mundo fechado .

Como alternativa à semântica de completação, a negação como falha também pode ser interpretada epistemicamente, como na semântica de modelo estável da programação de conjuntos de respostas . Nesta interpretação not(B i ) significa literalmente que B i não é conhecido ou não acreditado. A interpretação epistêmica tem a vantagem de poder ser combinada de forma muito simples com a negação clássica, como na "programação lógica estendida", para formalizar frases como "o contrário não pode ser mostrado", onde "contrário" é a negação clássica e "não pode ser mostrado" é a interpretação epistêmica da negação como fracasso.

Representação do conhecimento

O fato de que as cláusulas de Horn podem receber uma interpretação processual e, vice-versa, que os procedimentos de redução de objetivos podem ser entendidos como cláusulas de Horn + raciocínio inverso significa que os programas lógicos combinam representações declarativas e processuais do conhecimento . A inclusão da negação como falha significa que a programação lógica é um tipo de lógica não monotônica .

Apesar de sua simplicidade em comparação com a lógica clássica, essa combinação de cláusulas de Horn e negação como falha provou ser surpreendentemente expressiva. Por exemplo, ele fornece uma representação natural para as leis do senso comum de causa e efeito, conforme formalizado tanto pelo cálculo de situação quanto pelo cálculo de evento . Também foi demonstrado que corresponde naturalmente à linguagem semiformal da legislação. Em particular, Prakken e Sartor [12] creditam a representação do British Nationality Act como um programa lógico [13]com ser "extremamente influente para o desenvolvimento de representações computacionais da legislação, mostrando como a programação lógica permite representações intuitivamente atraentes que podem ser implantadas diretamente para gerar inferências automáticas".

Variantes e extensões

Prólogo

A linguagem de programação Prolog foi desenvolvida 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 a lógica para representar a semântica e usando a resolução para responder a 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 teoremas de resolução poderiam ser usados ​​para análise sintática. Eles observaram que alguns provadores de teoremas, como hiper-resolução, se comportam como analisadores de baixo para cima e outros, como resolução SL(1971), se comportam como analisadores top-down.

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/procedural mais tarde foi formalizada na notação Prolog

H :- B1, …, Bn.

que pode ser lido (e usado) tanto declarativamente quanto procedimentalmente. Também ficou claro que tais cláusulas poderiam ser restritas a cláusulas definidas ou cláusulas de Horn , onde H, , ..., são todas fórmulas lógicas de predicados atômicos, e que a resolução SL poderia ser restrita (e generalizada) à resolução LUSH ou SLD . A interpretação processual de Kowalski e o LUSH foram descritos em um memorando de 1973, publicado em 1974. [6]B1Bn

Colmerauer, com Philippe Roussel, usou essa dupla interpretação 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, era um sistema francês de perguntas e respostas . O uso do Prolog como uma linguagem de programação prática recebeu grande impulso pelo desenvolvimento de um compilador por David Warren em Edimburgo em 1977. Experimentos demonstraram que o Edinburgh Prolog poderia competir com a velocidade de processamento de outras linguagens de programação simbólicas como Lisp . O Edinburgh Prolog tornou-se o padrão de fato e influenciou fortemente a definição do padrão ISO Prolog.

Programação lógica abdutiva

A programação lógica abdutiva é uma extensão da programação lógica normal que permite que alguns predicados, declarados como predicados abdutíveis, sejam "abertos" ou indefinidos. Uma cláusula em um programa de lógica abdutiva tem a forma:

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

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

false :- L1, …, Ln.

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

canfly ( X )  :-  pássaro ( X ),  normal ( X ). 
false  :-  normal ( X ),  ferido ( X ). 
pássaro ( joão ). 
pássaro ( maria ). 
ferido ( João ).

onde o predicado normalé abdutível.

A resolução de problemas é alcançada pela derivação de hipóteses expressas em termos de predicados abdutíveis como soluções para problemas a serem resolvidos. Esses 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 = marypara o objetivo de encontrar algo que possa voar:

:-  mosca ( X ).

A programação lógica abdutiva tem sido usada para diagnóstico de falhas, planejamento, processamento de linguagem natural e aprendizado de máquina. Também tem sido usado para interpretar Negação como Fracasso como uma forma de raciocínio abdutivo.

Programação Metalógica

Como a lógica matemática tem uma longa tradição de distinguir entre linguagem de objeto e metalinguagem, a programação lógica também permite a programação de metanível . O programa metalógico mais simples é o chamado meta-interpretador " baunilha ":

    resolver ( verdadeiro ). 
    resolver (( A , B )):-  resolver ( A ), resolver ( B ). 
    resolver ( A ):-  cláusula ( A , B ), resolver ( B ).

onde true representa uma conjunção vazia e cláusula(A,B) significa que existe uma cláusula de nível de objeto da forma A :- B.

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

Programação lógica de restrição

A programação lógica de restrição combina a programação lógica da cláusula Horn com a solução de restrição . Ele estende as cláusulas de Horn permitindo que alguns predicados, declarados como predicados de restrição, ocorram como literais no corpo das cláusulas. Um programa de lógica de restrição é um conjunto de cláusulas da forma:

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

onde He todos são fórmulas atômicas e são restrições. Declarativamente, tais cláusulas são lidas como implicações lógicas comuns: BiCi

H if C1 and … and Cn and B1 and … and 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 de modelo de domínio específico.

Processualmente, os subobjetivos cujos predicados são definidos pelo programa são resolvidos por redução de objetivos, como na programação lógica comum, mas as restrições são verificadas quanto à satisfatibilidade por um solucionador de restrições específico do domínio, que implementa a semântica dos predicados de restrição. Um problema inicial é resolvido reduzindo-o a uma conjunção satisfatória de restrições.

O seguinte programa de lógica de restrição representa um banco de dados temporal de brinquedo da john'shistória como professor:

ensina ( john ,  hardware ,  T )  :-  1990   T ,  T  <  1999. 
ensina ( john ,  software ,  T )  :-  1999   T ,  T  <  2005. 
ensina ( john ,  logic ,  T )  :-  2005   T ,  T   2012. 
classificação ( joão ,  instrutor ,  T)  :-  1990   T ,  T  <  2010. 
classificação ( john ,  professor ,  T )  :-  2010   T ,  T  <  2014.

Aqui e <são predicados de restrição, com sua semântica usual. A cláusula de meta a seguir consulta o banco de dados para descobrir quando johnensinou logice foi um professor:

:- teaches(john, logic, T), rank(john, professor, T).

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

A programação de lógica de restrição tem sido usada para resolver problemas em áreas como engenharia civil , engenharia mecânica , verificação de circuito digital , programação automatizada , controle de tráfego aéreo e finanças. Está intimamente relacionado com a programação lógica abdutiva .

Programação lógica concorrente

A programação lógica concorrente integra conceitos de programação lógica com programação concorrente . Seu desenvolvimento teve um grande impulso na década de 1980 pela escolha da linguagem de programação de sistemas do Projeto de Quinta Geração Japonês (FGCS) . [14]

Um programa de lógica concorrente é um conjunto de cláusulas Horn protegidas da forma:

H :- G1, …, Gn | B1, …, Bn.

A conjunção é chamada de guarda da oração e é o operador de compromisso. Declarativamente, cláusulas de Horn protegidas são lidas como implicações lógicas comuns: G1, ... , Gn |

H if G1 and … and Gn and B1 and … and Bn.

No entanto, processualmente, quando há várias cláusulas cujas cabeças H correspondem a um determinado objetivo, todas as cláusulas são executadas em paralelo, verificando se suas guardas são válidas . Se as guardas de mais de uma cláusula forem válidas, uma escolha comprometida é feita para uma das cláusulas e a execução prossegue com os subobjetivos da cláusula escolhida. Esses subobjetivos também podem ser executados em paralelo. Assim, a programação lógica concorrente implementa uma forma de "não me importo com o não determinismo", em vez de "não sei o não determinismo". G1, ... , Gn B1, ..., Bn

Por exemplo, o seguinte programa de lógica concorrente define um predicado shuffle(Left, Right, Merge) , que pode ser usado para embaralhar duas listas Lefte Right, combinando-as em uma única lista Mergeque preserva a ordem das duas listas Lefte Right:

embaralhar ([],  [],  []). 
shuffle ( Esquerda ,  Direita ,  Mesclar )  :- 
    Esquerda  =  [ Primeiro  |  Descanso ]  | 
    Mesclar  =  [ Primeiro  |  ShortMerge ], 
    shuffle ( Rest ,  Right ,  ShortMerge ). 
shuffle ( Esquerda ,  Direita ,  Mesclar )  :- 
    Direita  =  [ Primeiro  |  Descanso ]  |
    Mesclar  =  [ Primeiro  |  ShortMerge ], 
    shuffle ( Left ,  Rest ,  ShortMerge ).

Aqui, []representa a lista vazia e [Head | Tail]representa uma lista com o primeiro elemento Headseguido por list Tail, como em Prolog. (Observe que a primeira ocorrência de | na segunda e terceira cláusulas é o construtor de lista, enquanto a segunda ocorrência de | é o operador de confirmação.) O programa pode ser usado, por exemplo, para embaralhar as listas [ace, queen, king]e [1, 4, 2]invocando a cláusula de objetivo:

embaralhar ([ ás ,  rainha ,  rei ],  [ 1 ,  4 ,  2 ],  Mesclar ).

O programa irá gerar de forma não determinística uma única solução, por exemplo Merge = [ace, queen, 1, king, 4, 2].

Indiscutivelmente, a programação lógica concorrente é baseada na passagem de mensagens, portanto, está sujeita à mesma indeterminação que outros sistemas de passagem de mensagens simultâneas, como Atores (consulte Indeterminação na computação concorrente ). Carl Hewitt argumentou que a programação lógica concorrente não é baseada na lógica em seu sentido de que as etapas computacionais não podem ser deduzidas logicamente. [15] No entanto, na programação lógica concorrente, qualquer resultado de uma computação final é 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 do processo). Assim, a indeterminação dos cálculos implica que nem todas as consequências lógicas do programa podem ser deduzidas. [ neutralidadeé contestado ]

Programação lógica de restrição concorrente

A programação lógica de restrição simultânea combina programação lógica simultânea e programação lógica de restrição , usando restrições para controlar a simultaneidade. Uma cláusula pode conter uma guarda, que é um conjunto de restrições que podem bloquear a aplicabilidade da cláusula. Quando as guardas de várias cláusulas são satisfeitas, a programação lógica de restrição concorrente faz uma escolha confirmada para usar apenas uma.

Programação lógica indutiva

A programação lógica indutiva está preocupada em generalizar exemplos positivos e negativos no contexto de conhecimento prévio: aprendizado de máquina de programas lógicos. Trabalhos recentes nesta área, combinando programação lógica, aprendizado e probabilidade, deram origem ao novo campo de aprendizado relacional estatístico e programação lógica indutiva probabilística .

Programação lógica de ordem superior

Vários pesquisadores estenderam a programação lógica com recursos de programação de ordem superior derivados da lógica de ordem superior , como variáveis ​​de predicado. Tais linguagens incluem as extensões de Prolog HiLog e λProlog .

Programação lógica linear

Basear a programação lógica dentro da lógica linear resultou no projeto de linguagens de programação lógica que são consideravelmente mais expressivas do que aquelas baseadas na lógica clássica. Programas de cláusula Horn só podem representar mudança de estado pela mudança de argumentos para predicados. Na programação de 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 em lógica linear incluem LO [Andreoli & Pareschi, 1991], Lolli, [16] ACL, [17] e Forum [Miller, 1996]. O fórum fornece uma interpretação direcionada a objetivos de toda a lógica linear.

Programação lógica orientada a objetos

O F-logic estende a programação lógica com objetos e a sintaxe do quadro.

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 o padrão como compiladores de back-end.

Programação de lógica de transação

A lógica de transação é uma extensão da programação lógica com uma teoria lógica de atualizações de modificação de estado. Tem tanto uma semântica teórico-modelo quanto uma semântica procedimental. Uma implementação de um subconjunto de lógica de transação está disponível no sistema Flora-2 . Outros protótipos também estão disponíveis .

Veja também

Citações

  1. ^ a b T. Winograd (1972). "Compreendendo a linguagem natural". Psicologia Cognitiva . 3 (1): 1–191. doi : 10.1016/0010-0285(72)90002-3 .
  2. ^ Cordel Verde. " Aplicação da Prova de Teoremas à Resolução de Problemas ". IJCAI 1969.
  3. ^ JM Foster e EW Elcock. ABSYS 1: Um Compilador Incremental para Asserções: uma Introdução, Machine Intelligence 4, Edinburgh U Press, 1969, pp. 423–429
  4. ^ Carl Hewitt. "Planner: Uma linguagem para provar teoremas em robôs". IJCAI 1969.
  5. ^ Pat Hayes. Cálculo e Dedução. Anais do 2º Simpósio MFCS. Academia de Ciências da Tchecoslováquia, 1973, pp. 105-118.
  6. ^ a b Robert Kowalski, "Predicate Logic as a Programming Language" , Memorando 70, Departamento de Inteligência Artificial, Universidade de Edimburgo, 1973. Também em Anais IFIP Congress, Estocolmo, North Holland Publishing Co., 1974, pp. 569–574.
  7. ^ Robert Kowalski e Donald e Kuehner, "Resolução Linear com Função de Seleção" , Inteligência Artificial , Vol. 2, 1971, pp. 227-60.
  8. ^ Shapiro, Ehud (1989). A família de linguagens de programação lógica concorrente (PDF) . Escola Internacional de Verão em Lógica, Álgebra e Computação. Também apareceu em Shapiro, E. (1989). "A família de linguagens de programação lógica concorrente" . Pesquisas de Computação ACM . 21 (3): 413-510. doi : 10.1145/72551.72555 . S2CID 2497630 . 
  9. ^ Sáenz-Perez, Fernando; Caballero, Rafael; García-Ruiz, Yolanda (dezembro de 2011). Um Banco de Dados Dedutivo com Datalog e SQL Query Language (PDF) . Simpósio Asiático sobre Linguagens e Sistemas de Programação. Springer. págs. 66–73.
  10. ^ Van Emden, MH e Kowalski, RA, 1976. A semântica da lógica de predicados como linguagem de programação. Jornal da ACM (JACM), 23(4), pp.733-742.
  11. ^ RAKowalski (julho de 1979). "Algoritmo = Lógica + Controle". Comunicações da ACM . 22 (7): 424–436. doi : 10.1145/359131.359136 . S2CID 2509896 . 
  12. ^ Prakken, H. e Sartor, G., 2015. Direito e lógica: uma revisão de uma perspectiva argumentativa . Inteligência Artificial, 227, 214-245.
  13. ^ Sergot, MJ, Sadri, F., Kowalski, RA, Kriwaczek, F., Hammond, P. e Cory, HT, 1986. O ato britânico da nacionalidade como um programa lógico . Comunicações da ACM, 29(5), 370–386.
  14. ^ Shunichi Uchida e Kazuhiro Fuchi. Anais do Workshop de Avaliação de Projetos do FGCS . Instituto de Informática de Nova Geração (ICOT). 1992.
  15. Hewitt, Carl (27 de abril de 2016). "Robustez de Inconsistência para Programas Lógicos" . Arquivos Hal. págs. 21–26 . Recuperado em 7 de novembro de 2016 .
  16. ^ Joshua Hodas e Dale Miller, " Programação Lógica em um Fragmento de Lógica Linear Intuicionista ", Informação e Computação , 1994, 110(2), 327–365.
  17. Naoki Kobayashi e Akinori Yonezawa , "Modelo de comunicação assíncrona baseado em lógica linear" , US/Japan Workshop on Parallel Symbolic Computing , 1994, 279–294.

Fontes

Apresentações gerais

Outras fontes

Leitura adicional

Links externos