Programao lgica um paradigma de programao que faz uso da lgica
matemtica. John McCarthy [1958] foi o primeiro a publicar uma proposta de uso da lgica matemtica para programao. A primeira linguagem de programao lgica foi a Planner, a qual permitia a invocao orientada a padres de planos procedimentais de asseres e de objetivos. Com a necessidade de adaptao aos sistemas de memria muito limitada, que eram disponveis quando ela foi desenvolvida. A linguagem Planner usava estruturas de controle de backtracking, de tal forma que apenas um nico caminho computacional tinha que ser armazenado por vez. Em seguida, o Prolog foi desenvolvido como uma simplificao do Planner que permitia a invocao orientada a padres apenas a partir de objetivos (tambm baseado em backtracking). 1
A partir do Planner, foram desenvolvidas as linguagens de programao QA-4, Popler, Conniver, e QLISP. As linguagens de programao Mercury, Visual Prolog, Oz e Frill, foram desenvolvidas a partir do Prolog. Atualmente existem linguagens de programao lgica concorrente (no baseadas em backtracking) derivadas do Planner (por exemplo, a Ether) e derivadas do Prolog (ver Shapiro 1989 para um apanhado geral). Histria A programao lgica uma idia que tem sido investigada no contexto da inteligncia artificial pelo menos desde o momento em que John McCarthy [1958] props: "programas para manipular com sentenas instrumentais comuns apropriadas linguagem formal (muito provavelmente uma parte do clculo de predicado)". O programa bsico formar concluses imediatas a partir de uma lista de premissas. Essas concluses sero tanto sentenas declarativas quanto imperativas. Quando uma sentena imperativa deduzida, o programa toma uma ao correspondente.
A lgica de programao tem como objetivo realizar funes ou esquemas lgicos por meio de parmetros e metas.
Base na lgica matemtica O sentido da programao lgica trazer o estilo da lgica matemtica programao de computadores. Matemticos e filsofos encontram na lgica uma ferramenta eficaz para desenvolvimento de teorias. Vrios problemas so naturalmente expressos como teorias. Dizer que um problema precisa de soluo frequentemente equivale a perguntar se uma nova hiptese consistente com uma teoria existente ou se conseqncia dela. A lgica proporciona uma maneira de demonstrar se uma questo verdadeira ou falsa.
O processo de construir uma demonstrao bem conhecido, portanto a lgica um meio confivel de responder perguntas. Sistemas de programao lgica automatizam este processo. A inteligncia artificial teve uma influncia importante no desenvolvimento da programao lgica. Prolog Ver artigo principal: Prolog A linguagem de programao Prolog foi explicitamente apresentada como baseada na lgica matemtica. A base dessa alegao era que um programa Prolog podia literalmente ser lido como um conjunto de frmulas em um fragmento da lgica de primeira ordem, herdando o modelo de teoria e demonstrao da lgica de primeira ordem.
Prolog foi desenvolvida em 1972 por Alain Colmerauer. Ela veio de uma colaborao entre Colmerauer em Marselha e Robert Kowalski em Edinburgo. Colmerauer estava trabalhando na compreenso da linguagem natural, usando lgica para representar semnticas e usando resoluo para questionamento- resposta. Durante o vero de 1971, Colmerauer e Kowalski descobriram que a forma clausal da lgica poderia ser usada para representar gramticas formais e que demonstraes do teorema da resoluo poderia ser usado para anlise gramatical. Eles observaram que algumas demonstraes de teoremas, como o da hiper-resoluo, comportavam-se como analisadores ascendentes e outros, como resoluo-SL (1971), comportavam-se como analisadores descendentes.
Durante o seguinte vero de 1972, Kowalski, novamente trabalhando com Colmerauer, observou que resoluo-SL trata clusulas universalmente quantificadas na forma declarativa de implicaes. B 1 e e B n implica H
Como procedimentos de objetivo-reduo para mostrar/resolver H, mostrar/resolver B1 e e Bn. Essa interpretao dupla declarativa/procedimental depois foi formalizada na notao do Prolog H :- B 1 , , B n . que pode ser lida (e usada) tanto declarativamente como procedimentalmente. Tornou-se tambm claro que tais clusulas poderiam ser restringidas para definir clusulas ouclusulas de Horn, em que H, B 1 , , B n so todos os predicados atmicos, e que resoluo-SL poderia ser restrita (e gerada) para LUSH ou resoluo-SLD. Colmerauer, com Philippe Roussel, usou essa interpretao dupla de clusulas assim como a base do Prolog, a qual foi implementada no vero e outono de 1972. O primeiro programa na linguagem, tambm escrito em 1972 e implementado em Marseille, foi um sistema francs de pergunta-resposta. A interpretao procedimental de Kowalski e LUSH foi depois descrita em um memorando em 1973, publicado em 1974. A relao prxima entre interpretao declarativa e processual resulta numa caracterstica tpica das linguagens de programao lgica, embora a relao se torne mais complexa quando h negao, disjuno e outros quantificadores so permitidos em programas.
Negao por falha Micro-Planner teve uma construo, chamada "thnot", que quando aplicada a uma expresso retorna o valor verdadeiro se (e somente se) a avaliao da expresso falha. Um operador equivalente normalmente construdo em implementaes do Prolog moderno e tem sido chamado "negao por falha". Ele normalmente escrito como not(p), onde p um tomo cujas variveis foram normalmente instanciadas no momento que not(p) invocado. Uma sintaxe mais complexa (mas padro) \+ p . Literais de negao por falha podem ocorrer como condies not(B i ) no corpo das clusulas do programa. Ainda que incompleta, a regra de negao como falha uma slida regra de inferncia (sob certas restries) respeitando a concluso de um programa. Concluso de um programa lgico foi inicialmente definida por Keith Clark basicamente assemelhava-se a considerar o conjunto de todas as clusulas do programa, com o mesmo predicado, do lado esquerdo. H :- Corpo<sub>1</sub>
H :- Corpo<sub>k</sub> Como uma nica frmula equivalente H [[sse]] (Corpo<sub>1</sub> ou ou Corpo<sub>k</sub>)
Escrever o completamento tambm requer o uso explcito de predicado de igualdade e a incluso de um conjunto de axiomas apropriados por igualdade. A noo de concluso estreitamente relacionada tcnica de circunscrio de McCarty para desenvolver um raciocnio no monotnico, e a suposio de um mundo fechado. Como uma alternativa para semnticas de completamento, negao por falha tambm pode ser interpretada epistemologicamente, assim como na semntica de modelo estvel do conjunto de respostas. Nesta interpretao, not(B i ) significa literalmente que B i no conhecido ou no acreditado. A interpretao epistmica tem a vantagem que pode ser combinada muito simplesmente com a negao clssica, assim como na "lgica de programao estendida", para formalizar frases como "o contrrio no pode ser mostrado", onde "contrario" est a negao clssica e "que no pode ser mostrado" a interpretao epistmica da negao por falha.
Implementaes A primeira implementao do Prolog foi a Marseille Prolog, desenvolvida em 1972. O uso do Prolog como uma linguagem de programao prtica teve seu pice com o desenvolvimento de um compilador por David Warren em Edinburgo, em 1977. Alguns experimentos demonstraram que o Edinburgh Prolog podia competir com a velocidade de processamento de outras linguagens de programao simblica tais como Lisp. O Edinburgh Prolog tornou-se o padro de facto e influenciou a definio de Prolog padro ISO.
Limitaes do uso da lgica matemtica para a programao John McCarthy props que a lgica matemtica fosse usada como o fundamento para a epistemologia de sistemas de computadores. Sob a liderana de Marvin Minsky e Seymour Papert, uma abordagem diferente baseada em procedimentos processuais foi desenvolvida no MIT. Quando o Planner foi desenvolvido, levantou-se o a questo sobre o relacionamento entre as duas abordagens.
Robert Kowalski desenvolveu a tese que "computao pode concebida deduo" teve boa aceitao ao citar o slogan "a computao uma deduo controlada," que ele atribuiu a Pat Hayes em seu artigo de 1988 no incio da histria do Prolog. Ao contrrio de Kowalski e Hayes, Carl Hewitt desenvolveu a tese de que a deduo lgica era incapaz de executar computao concorrente em sistemas abertos. A resposta questo sobre a relao entre as abordagens lgica e procedimental que a abordagem procedimental tem uma semntica matemtica diferente (ver semntica denotacional) da semntica da lgica matemtica. Programao lgica linear Basear a programao lgica na lgica linear resultou no projeto de linguagens de programao lgica que so consideravelmente mais custosas do que aquelas baseadas na lgica clssica. Programas com clusulas de Horn (Prolog) podem apenas representar uma mudana de estado pela mudana em argumentos para predicados. Na programao lgica linear, pode-se usar a lgica linear como ambiente para dar suporte mudana de estado. Alguns projetos iniciais das linguagens de programao lgica baseadas na lgica linear, incluem LO [Andreoli & Pareschi, 1991], Lolli [Hodas & Miller, 1994], ACL [Kobayashi & Yonezawa, 1994], e Forum [Miller, 1996].O Frum proporciona a interpretao direcionada a objetivos de toda a lgica linear.