Prolog - Prolog


Da Wikipédia, a enciclopédia livre
Prolog
Paradigma lógica de programação
Projetado por Alain Colmerauer
Apareceu pela primeira vez 1972
extensões de arquivo .pl, .pro,.P
grandes implementações
B-Prolog , ciao , Eclipse , GNU Prolog , Jekejeke Prolog , Poplog Prolog, P # , Quintus Prolog , SICStus , morango , SWI-Prolog , Tau Prolog , tuProlog , WIN-PROLOG , XSB , YAP .
dialetos
ISO Prolog, Edimburgo Prolog
Influenciado por
Planner
Influenciado
CHR , Clojure , Datalog , Erlang , KL0 , KL1 , Mercury , Oz , Strand , Visual Prolog , XSB

Prolog é uma lógica de programação idioma associado com inteligência artificial e lingüística computacional .

Prolog tem suas raízes na lógica de primeira ordem , a lógica formal , e ao contrário de muitas outras linguagens de programação , Prolog destina-se principalmente como um declarativa linguagem de programação: a lógica do programa é expressa em termos de relações, representadas como fatos e regras . A computação é iniciado pela execução de uma consulta sobre essas relações.

A linguagem foi concebida por um grupo em torno de Alain Colmerauer em Marselha, França, no início de 1970 e o primeiro sistema de Prolog foi desenvolvido em 1972 por Colmerauer com Philippe Roussel.

Prolog foi uma das primeiras linguagens de programação lógica, e continua a ser o mais popular entre essas línguas hoje, com várias implementações livres e comerciais disponíveis. A linguagem tem sido usado por demonstração de teoremas , sistemas especialistas , reescrita prazo , sistemas do tipo , e planejamento automatizado , bem como seu campo original pretendido de uso, processamento de linguagem natural . Ambientes modernos Prolog apoiar a criação de interfaces gráficas de usuário , bem como aplicações administrativas e de rede.

Prolog é bem adequada para tarefas específicas que se beneficiam de consultas lógicas baseadas em regras, tais como bancos de dados em busca, controle de voz sistemas e modelos de enchimento.

Sintaxe e semântica

Em Prolog, a lógica do programa é expressa em termos de relações, e um cálculo é iniciado pela execução de uma consulta sobre essas relações. Relações e consultas são construídos usando tipo de dados único do Prolog, o termo . Relações são definidas por cláusulas . Dada uma consulta, o motor Prolog tenta encontrar uma resolução refutação da consulta negada. Se a consulta negado pode ser refutada, ou seja, uma instância para todas as variáveis livres é encontrado que faz a união de cláusulas eo conjunto singleton que consiste na consulta negada falsa, segue-se que a consulta original, com a instanciação encontrado aplicada, é um consequência lógica do programa. Isso faz com que Prolog (e outras linguagens de programação lógica) particularmente útil para banco de dados, matemática simbólica, e aplicações linguagem de análise. Porque Prolog permite impuros predicados , verificando o valor de verdade de certos predicados especiais podem ter algum deliberada efeito colateral , como a impressão de um valor para a tela. Devido a isso, o programador está autorizado a usar uma certa quantidade de convencional programação imperativa quando o paradigma lógico é inconveniente. Ele tem um subconjunto puramente lógico, chamado de "puro Prolog", bem como uma série de características extralogical.

Tipos de dados

Único do Prolog tipo de dados é o termo . Termos são ou átomos , números , variáveis ou termos compostos .

  • Um átomo é um nome de uso geral com nenhum significado inerente. Exemplos de átomos incluem x, red, 'Taco', e 'some atom'.
  • Números podem ser carros alegóricos ou inteiros . ISO sistemas Prolog compatível com a norma pode verificar a bandeira Prolog "limitada". A maioria dos principais sistemas Prolog suportar números de comprimento inteiro arbitrário.
  • Variáveis são indicados por uma string consistindo de letras, números e caracteres de sublinhado, e começando com uma letra maiúscula ou sublinhado. Variáveis assemelham variáveis na lógica em que eles são espaços reservados para termos arbitrários.
  • Um termo composto é constituído por um átomo de um chamado "functor" e uma série de "argumentos", que são novamente termos. Termos compostos são vulgarmente escritas como um functor seguido por uma lista separada por vírgulas de termos de argumento, que está contido em parênteses. O número de argumentos é chamado do termo arity . Um átomo pode ser considerada como um termo composto com aridade zero. Um exemplo de termos compostos é 'Person_Friends'(zelda,[tom,jim]).

Casos especiais de termos compostos:

  • A lista é uma coleção ordenada de termos. Ele é designado por colchetes com os termos separados por vírgulas ou, no caso da lista vazia, []. Por exemplo, [1,2,3]ou [red,green,blue].
  • Cordas : Uma sequência de caracteres entre aspas é equivalente a qualquer um de uma lista de (numéricos), códigos de caracteres Uma lista de caracteres (átomos de comprimento 1), ou um átomo de acordo com o valor da bandeira Prolog double_quotes. Por exemplo, "to be, or not to be".

ISO Prolog fornece os atom/1, number/1, integer/1, e float/1predicados para verificação de tipo .

Regras e fatos

Programas Prolog descrever as relações, definidas por meio de cláusulas. Pure Prolog é restrito a cláusulas de Horn . Existem dois tipos de cláusulas: fatos e regras. Uma regra é da forma

Head :- Body.

e é lido como "Cabeça é verdade se o corpo é verdadeiro". O corpo de uma regra consiste em chamadas para predicados, que são chamados da regra objetivos . O embutido predicado ,/2 (ou seja, um 2-aridade operador com nome ,) indica a conjugação de objectivos, e ;/2indica a disjunção . Conjunções e disjunções só pode aparecer no corpo, não na cabeça de uma regra.

Cláusulas com corpos vazios são chamados fatos . Um exemplo de um fato é:

cat(tom).

o que equivale à regra:

cat(tom) :- true.

O predicado built-in true/0é sempre verdadeiro.

Dado o fato acima, pode-se perguntar:

é tom um gato?

 ?- cat(tom).
 Yes

que as coisas são gatos?

 ?- cat(X).
 X = tom

Cláusulas com corpos são chamados de regras . Um exemplo de uma regra é:

animal(X) :- cat(X).

Se somarmos essa regra e perguntar o que as coisas são animais?

 ?- animal(X).
 X = tom

Devido à natureza relacional de muitos predicados embutidos, eles podem normalmente ser usado em várias direções. Por exemplo, length/2pode ser utilizada para determinar o comprimento de uma lista ( length(List, L), dada uma lista List), bem como para gerar um esqueleto lista de um dado comprimento ( length(X, 5)), e também para gerar ambos os esqueletos de lista e os seus comprimentos em conjunto ( length(X, L)). Da mesma forma, append/3pode ser usado tanto para anexar duas listas ( append(ListA, ListB, X)listas dadas ListAe ListB), bem como para dividir uma determinada lista em partes ( append(X, Y, List), dada uma lista List). Por esta razão, um relativamente pequeno conjunto de predicados biblioteca é suficiente para muitos programas Prolog.

Como uma linguagem de propósito geral, Prolog também fornece vários predicados incorporada para realizar actividades de rotina, tais como entrada / saída , o uso de gráficos e de outro modo a comunicar com o sistema operativo. Estes predicados não é dado um significado relacional e só são úteis para os efeitos colaterais que eles apresentam no sistema. Por exemplo, o predicado write/1exibe um termo na tela.

Execução

Execução de um programa Prolog é iniciada por postagem do usuário de um único objetivo, chamada de consulta. Logicamente, o motor Prolog tenta encontrar uma resolução refutação da consulta negada. O método de resolução usado por Prolog é chamado de resolução SLD . Se a consulta negado pode ser refutada, segue-se que a consulta, com as ligações variáveis apropriadas no lugar, é uma consequência lógica do programa. Nesse caso, todas as ligações variáveis geradas são relatados para o usuário, ea consulta é dito ter conseguido. Operacionalmente, estratégia de execução do Prolog pode ser pensado como uma generalização da função chama em outros idiomas, uma diferença é que várias cabeças cláusula pode corresponder a uma determinada chamada. Nesse caso, o sistema cria um ponto de escolha, unifica o objetivo com a cabeça cláusula da primeira alternativa, e continua com os objetivos de que a primeira alternativa. Se qualquer objetivo falha no curso da execução do programa, todas as ligações variáveis que foram feitas desde a escolha ponto mais recente foi criado são desfeitas, e a execução continua com a próxima alternativa de que a escolha de ponto. Esta estratégia de execução é chamado cronológica retrocesso . Por exemplo:

mother_child(trude, sally).
 
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
 
sibling(X, Y)      :- parent_child(Z, X), parent_child(Z, Y).
 
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).

Isto resulta na seguinte consulta a ser avaliada como verdadeira:

 ?- sibling(sally, erica).
 Yes

Isto é obtido como se segue: Inicialmente, o único correspondente cláusula de cabeça para a consulta sibling(sally, erica)é o primeiro, de modo a revelar a consulta é equivalente a provar o corpo do referido artigo, com as ligações apropriadas variáveis no local, ou seja, o conjunto (parent_child(Z,sally), parent_child(Z,erica)). O objectivo seguinte para ser provado é o mais à esquerda deste conjunto, isto é, parent_child(Z, sally). Duas cabeças cláusula corresponder a esse objetivo. O sistema cria um ponto de escolha e tenta a primeira alternativa, cujo corpo é father_child(Z, sally). Este objectivo pode ser comprovada utilizando o fato father_child(tom, sally), de modo que a ligação Z = tomé gerado, e a próxima baliza a ser comprovado é a segunda parte do conjunto acima: parent_child(tom, erica). Novamente, isso pode ser comprovado pelo fato correspondente. Desde todas as metas poderia ser provado, a consulta for bem-sucedido. Desde a consulta não continha variáveis, não ligações são relatados para o usuário. Uma consulta com variáveis, tais como:

?- father_child(Father, Child).

enumera todas as respostas válidas em retrocesso.

Note-se que com o código como dito acima, a consulta ?- sibling(sally, sally).também consegue. Alguém poderia inserir metas adicionais para descrever as restrições relevantes, se desejar.

Loops e recursão

algoritmos iterativos pode ser implementada por meio de predicados recursivos.

Negação

O predicado Prolog embutido \+/1fornece negação como falha , o que permite não monótona raciocínio. O objetivo \+ illegal(X)na regra

legal(X) :- \+ illegal(X).

é avaliada como se segue: Prolog tentativas para provar illegal(X). Se uma prova para esse objetivo pode ser encontrado, o objetivo original (ou seja, \+ illegal(X)) falhar. Se nenhuma prova pode ser encontrado, o objetivo original bem-sucedido. Portanto, o \+/1operador de prefixo é chamado o operador "não provável", uma vez que a consulta ?- \+ Goal.for bem-sucedido se o objetivo não é demonstrável. Este tipo de negação é som se seu argumento é "terra" (ou seja, não contém variáveis). Solidez é perdido se o argumento contém variáveis e o procedimento de prova está completa. Em particular, a consulta ?- legal(X).agora não pode ser usado para enumerar todas as coisas que são legais.

Programação em Prolog

Em Prolog, código de carregamento é referido como consultoria . Prolog pode ser usado de forma interativa, inserindo consultas no prompt do Prolog ?-. Se não houver solução, Prolog escreve no. Se existe uma solução, em seguida, ele é impresso. Se existirem várias soluções para a consulta, em seguida, estes podem ser solicitados inserindo um ponto e vírgula ;. Existem orientações sobre boas práticas de programação para melhorar a eficiência do código, legibilidade e manutenção.

Aqui seguem alguns exemplos de programas escritos em Prolog.

Olá Mundo

Um exemplo de uma consulta:

?- write('Hello World!'), nl.
Hello World!
true.

?-

otimização do compilador

Qualquer computação pode ser expressa de forma declarativa como uma sequência de transições de estado. Como um exemplo, um compilador otimizado com três passes de optimização pode ser implementado como uma relação entre um programa inicial e a sua forma optimizada:

program_optimized(Prog0, Prog) :-
    optimization_pass_1(Prog0, Prog1),
    optimization_pass_2(Prog1, Prog2),
    optimization_pass_3(Prog2, Prog).

ou equivalentemente usando DCG notação:

program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.

Ordenação rápida

O quicksort algoritmo de classificação, relacionando uma lista para a sua versão ordenada:

partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
    (   X @< Pivot ->
        Smalls = [X|Rest],
        partition(Xs, Pivot, Rest, Bigs)
    ;   Bigs = [X|Rest],
        partition(Xs, Pivot, Smalls, Rest)
    ).
 
quicksort([])     --> [].
quicksort([X|Xs]) -->
    { partition(Xs, X, Smaller, Bigger) },
    quicksort(Smaller), [X], quicksort(Bigger).

Padrões de design

Um padrão de design é uma solução reutilizável geral para um problema que ocorre comumente em design de software . Em Prolog, padrões de projeto ir sob vários nomes: esqueletos e técnicas, clichês, esquemas programa e descrição lógica esquemas. Uma alternativa para projetar padrões é maior programação fim .

programação de ordem superior

Um predicado de ordem superior é um predicado que tem um ou mais outros predicados como argumentos. Embora o suporte para a programação de ordem mais elevada leva Prolog fora do domínio da lógica de primeira ordem, que não permite a quantificação sobre predicados, ISO Prolog agora tem alguns predicados de ordem superior embutidos tais como call/1, call/2, call/3, findall/3, setof/3, e bagof/3. Além disso, desde metas arbitrárias Prolog pode ser construída e avaliada em tempo de execução, é fácil escrever predicados de ordem superior como maplist/2, que se aplica um predicado arbitrário para cada membro de uma determinada lista, e sublist/3, que filtra os elementos que satisfazem um dado predicado , também permitindo currying .

Para converter soluções de representação temporal (responder substituições no retrocesso) a representação espacial (termos), Prolog tem várias soluções all-predicados que recolhem todas as substituições resposta de uma determinada consulta de uma lista. Isso pode ser usado para a compreensão da lista . Por exemplo, números perfeitos igual a soma de seus divisores apropriados:

 perfect(N) :-
     between(1, inf, N), U is N // 2,
     findall(D, (between(1,U,D), N mod D =:= 0), Ds),
     sumlist(Ds, N).

Isso pode ser usado para enumerar números perfeitos, e também para verificar se um número é perfeito.

Como outro exemplo, o predicado maplistaplica-se um predicado Ppara todas as posições correspondentes em um par de listas:

maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :-
   call(P, X, Y),
   maplist(P, Xs, Ys).

Quando Pé um predicado que para todos X, P(X,Y)unifica Ycom um único valor único, maplist(P, Xs, Ys)é equivalente a aplicar o mapa função em programação funcional como Ys = map(Function, Xs).

Estilo de programação de ordem superior em Prolog foi pioneira em HiLog e λProlog .

módulos

Para a programação no grande , Prolog fornece um sistema de módulos . O sistema de módulo é padronizado pela ISO. No entanto, nem todos os compiladores Prolog apoiar módulos, e existem problemas de compatibilidade entre os sistemas de módulos dos principais compiladores Prolog. Consequentemente, módulos escritos em um compilador Prolog não vai necessariamente funcionar em outros.

Análise

Há uma notação especial chamado gramática de cláusulas definidas (DCG). A regra definida via -->/2, em vez de :-/2se expandiu pelo pré-processador ( expand_term/2, uma instalação análogo ao macros em outros idiomas) de acordo com algumas regras de reescrita simples, resultando em cláusulas Prolog comuns. Mais notavelmente, a reescrita equipa o predicado com dois argumentos adicionais, que podem ser usados para enfiar implicitamente estado em torno de, análogas às mônadas em outros idiomas. DCG são muitas vezes utilizados para escrever analisadores ou geradores da lista, como eles também fornecem uma interface conveniente para listas de diferença.

Meta-intérpretes e reflexão

Prolog é um homoiconic linguagem e oferece muitas facilidades para reflexão . Sua estratégia de execução implícita torna possível escrever um conciso avaliador meta-circular (também chamado de meta-intérprete ) para o código Prolog puro:

solve(true).
solve((Subgoal1,Subgoal2)) :- 
    solve(Subgoal1),
    solve(Subgoal2).
solve(Head) :- 
    clause(Head, Body),
    solve(Body).

em que truerepresenta um conjunto vazio, e clause(Head, Body)unifica com cláusulas do banco de dados do formulário Head :- Body.

Desde programas Prolog são elas mesmas sequências de termos Prolog ( :-/2é um infixo operador ) que são facilmente lido e inspecionado usando built-in mecanismos (como read/1), é possível escrever intérpretes personalizadas que aumentam Prolog com características específicas de domínio. Por exemplo, Sterling e Shapiro apresentar uma meta-intérprete que executa raciocínio com incerteza, reproduzido aqui, com ligeiras modificações:

solve(true, 1) :- !.
solve((Subgoal1,Subgoal2), Certainty) :-
    !,
    solve(Subgoal1, Certainty1),
    solve(Subgoal2, Certainty2),
    Certainty is min(Certainty1, Certainty2).
solve(Goal, 1) :-
    builtin(Goal), !, 
    Goal.
solve(Head, Certainty) :-
    clause_cf(Head, Body, Certainty1),
    solve(Body, Certainty2),
    Certainty is Certainty1 * Certainty2.

Este intérprete utiliza uma tabela de predicados embutidos Prolog da forma

builtin(A is B).
builtin(read(X)).
% etc.

e cláusulas representado como clause_cf(Head, Body, Certainty). Dado aqueles, ele pode ser chamado como solve(Goal, Certainty)para executar Goale obter uma medida de certeza sobre o resultado.

Turing completude

Pure Prolog é baseado em um subconjunto de primeira ordem lógica de predicados , cláusulas de Horn , que é Turing completo . Completude de Turing de Prolog pode ser mostrado usando-o para simular uma máquina de Turing:

turing(Tape0, Tape) :-
    perform(q0, [], Ls, Tape0, Rs),
    reverse(Ls, Ls1),
    append(Ls1, Rs, Tape).
 
perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
    symbol(Rs0, Sym, RsRest),
    once(rule(Q0, Sym, Q1, NewSym, Action)),
    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
    perform(Q1, Ls1, Ls, Rs1, Rs).
 
symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).
 
action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).
 
left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

Um exemplo simples máquina de Turing é especificado pelos factos:

rule(q0, 1, q0, 1, right).
rule(q0, b, qf, 1, stay).

Esta máquina executa incrementação por um de um número de codificação unária: O loop sobre qualquer número de "células" 1 e anexa um "1" adicional no final. Exemplo consulta e resultado:

?- turing([1,1,1], Ts).
Ts = [1, 1, 1, 1] ;

Este ilustra como qualquer computação pode ser expressa de forma declarativa como uma sequência de transições de estado, implementado em Prolog como uma relação entre estados sucessivos de interesse.

Implementação

ISO Prolog

O ISO padrão Prolog consiste de duas partes. ISO / IEC 13211-1, publicado em 1995, visa padronizar as práticas existentes de muitas implementações dos elementos centrais do Prolog. Ele esclareceu aspectos da língua que antes eram ambíguas e leva a programas portáteis. Há três rectificações: Cor.1: 2007, Cor.2: 2012, e Cor.3: 2017. ISO / IEC 13211-2, publicado em 2000, adiciona suporte para módulos para o padrão. O padrão é mantida pela norma ISO / IEC JTC1 / SC22 grupo de trabalho / WG17. ANSI X3J17 é o Grupo Consultivo Técnico dos EUA para o padrão.

Compilação

Para a eficiência, código Prolog normalmente é compilado para código de máquina abstrata, muitas vezes influenciado pelo baseados em registo Warren Abstract Máquina conjunto de instruções (WAM). Algumas implementações empregar interpretação abstrata para derivar tipo e modo de informação de predicados em tempo de compilação, ou compilar para código de máquina real para alto desempenho. Elaboração de métodos de implementação eficientes de código Prolog é um campo de pesquisa ativo na comunidade de programação lógica, e vários outros métodos de execução são empregados em algumas implementações. Estes incluem binarização cláusula e máquinas virtuais baseadas em pilha .

recursão de cauda

Sistemas Prolog tipicamente implementar um método de optimização chamado bem conhecida chamada cauda optimização (TCO) de predicados determinísticos exibem cauda recursão ou, mais geralmente, cauda chama: quadro de pilha de uma cláusula é descartado antes de efectuar uma chamada numa posição cauda. Portanto, predicados cauda-recursivo determinísticos são executados com espaço de pilha constante, como loops em outras línguas.

indexação prazo

Encontrar cláusulas que são unificáveis com um termo em uma consulta é linear no número de cláusulas. Indexação prazo utiliza uma estrutura de dados que permite sub-tempo linear pesquisas. Indexação afeta somente o desempenho do programa, não afeta a semântica. A maioria dos Prologs só usam a indexação no primeiro mandato, como indexação em todos os termos é caro, mas técnicas baseadas em palavras codificadas-campo ou sobrepostas codewords fornecer indexação rápida através da consulta completa e cabeça.

hashing

Alguns sistemas Prolog, como WIN-PROLOG e SWI-Prolog, agora implementar hash para ajudar a lidar com grandes conjuntos de dados de forma mais eficiente. Isto tende a dar resultados muito grandes ganhos de desempenho quando se trabalha com grandes corpora tais como WordNet .

a apresentação de

Alguns sistemas Prolog, ( B-Prolog , XSB , SWI-Prolog , YAP , e Ciao ), implementar um memoização método chamado de apresentação , que liberta o utilizador de armazenar os resultados intermédios manualmente.

Submetas encontradas em uma avaliação de consulta são mantidos em uma tabela, juntamente com respostas a essas submetas. Se um sub-objetivo é re-encontrou, a avaliação reutiliza as informações da tabela em vez de re-execução de resolução contra cláusulas do programa.

Apresentação é um trade-off espaço-tempo ; tempo de execução pode ser reduzido pelo uso de mais memória para armazenar resultados intermediários.

Implementação em hardware

Durante o projeto Computer Systems quinta geração , houve tentativas de implementar Prolog em hardware com o objectivo de conseguir uma execução mais rápida com arquiteturas dedicadas. Além disso, Prolog tem um número de propriedades que podem permitir velocidade-se através da execução paralela. Uma abordagem mais recente tem sido a de compilar programas Prolog restritos a um field-programmable gate array . No entanto, o progresso rápido em hardware de propósito geral tem consistentemente superado arquiteturas mais especializadas.

limitações

Embora Prolog é amplamente utilizado na investigação e educação, Prolog e outras linguagens de programação lógica não tiveram um impacto significativo sobre a indústria de computadores em geral. A maioria dos aplicativos são pequenos para os padrões industriais, com poucas superior a 100.000 linhas de código. Programação na grande é considerado ser complicado porque nem todos os módulos de suporte compiladores Prolog, e existem problemas de compatibilidade entre os sistemas de módulos dos principais compiladores Prolog. Portabilidade de código Prolog através implementações também tem sido um problema, mas os desenvolvimentos desde 2007 ter significado: "a portabilidade dentro da família de Edimburgo / Quintus derivado implementações Prolog é bom o suficiente para permitir a manutenção de aplicações do mundo real portáteis."

Software desenvolvido em Prolog tem sido criticado por ter uma penalidade alta performance em comparação com linguagens de programação convencionais. Em particular, a estratégia de avaliação não-determinista do Prolog pode ser problemático quando a programação cálculos deterministas, ou quando, mesmo usando "não se importam não-determinismo" (onde uma única escolha é feita em vez de recuar sobre todas as possibilidades). Cortes e outras construções de linguagem pode ter que ser utilizado para alcançar um desempenho desejável, destruindo uma das principais atracções de Prolog, a capacidade de executar programas "para trás e para a frente".

Prolog não é puramente declarativa: por causa de construções como o operador de corte , é necessária uma leitura processual de um programa Prolog para compreendê-lo. A ordem das cláusulas em um programa Prolog é significativo, como a estratégia de execução da linguagem depende disso. Outras linguagens de programação lógica, tais como registro de dados , são verdadeiramente declarativa, mas restringir o idioma. Como resultado, muitos programas Prolog práticos são escritos para estar de acordo com ordem de pesquisa em profundidade do Prolog, ao invés de programas lógicos como puramente declarativos.

extensões

Várias implementações foram desenvolvidas a partir Prolog para estender as capacidades de programação lógica em várias direções. Estes incluem tipos , modos de programação lógica restrição (CLP), orientada a objectos de programação lógica (OOLP), simultaneidade lógica linear (LLP), funcionais e de lógica de ordem mais elevada capacidade de programação, além de interoperabilidade com bases de conhecimento:

tipos

Prolog é uma linguagem sem tipo. As tentativas de introduzir tipos remontam à década de 1980, ea partir de 2008, há ainda tenta estender Prolog com tipos. Informações de tipo é útil não só para a segurança de tipos , mas também para raciocinar sobre programas Prolog.

modos

especificador de modo Interpretação
+ nonvar na entrada
- var na entrada
? Não especificado

A sintaxe do Prolog não especifica quais os argumentos de um predicado são entradas e quais são saídas. No entanto, esta informação é significativa e recomenda-se que seja incluída nos comentários. Modos de fornecer informações valiosas quando raciocínio sobre programas Prolog e também pode ser usado para acelerar a execução.

restrições

Lógica de programação restrição estende Prolog para incluir conceitos de satisfação de restrições . Um programa lógico restrição permite restrições no corpo de cláusulas, tais como: A(X,Y) :- X+Y>0. É adequado para grande escala de otimização combinatória problemas e é, portanto, útil para aplicações em ambientes industriais, tais como a calendarização automática e programação da produção . A maioria dos sistemas Prolog com pelo menos um solucionador de restrição para domínios finitos, e muitas vezes também com solucionadores para outros domínios, como números racionais.

Objeto-orientação

Flora-2 é uma representação e raciocínio sistema conhecimento orientada para o objecto com base no F-lógica e incorpora HiLog , lógica de transação , e raciocínio destrutível .

Logtalk é uma linguagem de programação lógica orientada a objetos que podem usar a maioria das implementações do Prolog como um compilador de back-end. Como uma linguagem multi-paradigma, que inclui suporte para ambos os protótipos e classes.

Oblog é uma pequena extensão, portátil, orientado a objetos para Prolog por Margaret McDougall de EdCAAD, Universidade de Edimburgo.

Objlog era uma linguagem baseada em quadros, combinando objetos e Prolog II do CNRS, Marseille, França.

Prolog ++ foi desenvolvido por Associates lógica de programação e lançado em 1989 para PCs MS-DOS. O suporte para outras plataformas foi adicionado, e uma segunda versão foi lançada em 1995. Um livro sobre Prolog ++ por Chris Moss foi publicado pela Addison-Wesley em 1994.

Gráficos

Sistemas Prolog que oferecem uma biblioteca de gráficos são SWI-Prolog , Visual Prolog , WIN-PROLOG , e B-Prolog .

simultaneidade

Prolog-MPI é um open-source SWI-Prolog extensão para computação distribuída sobre o Message Passing Interface . Além disso, existem vários idiomas simultâneos de programação Prolog.

Programação da Web

Algumas implementações Prolog, notadamente SWI-Prolog e Ciao, suporte do lado do servidor de programação web com suporte para protocolos da Web, HTML e XML . Há também extensões para apoiar web semântica formatos como RDF e OWL . Prolog Também tem sido sugerido como um client-side idioma.

Adobe flash

Cedar é um interpretador livre e básico Prolog. A partir da versão 4 ou superior Cedar tem um suporte FCA (Flash Cedar App). Isso fornece uma nova plataforma para programação em Prolog através ActionScript .

De outros

Interfaces para outros idiomas

existem estruturas que podem ponte entre Prolog e outras linguagens:

  • O LPA Intelligence Server permite a incorporação de LPA Prolog dentro C, C #, C ++, Java, VB, Delphi, Net, Lua, Python e outras linguagens. Ele explora o tipo de dados de cadeia dedicado que LPA Prolog fornece
  • A API Logic Server permite tanto a extensão e incorporação de Prolog em C, C ++, Java, VB, Delphi, .NET e qualquer linguagem / ambiente que pode chamar um arquivo .dll ou .so. Ele é implementado para Anzi! Prolog Anzi! Prolog + lógica do servidor , mas a especificação API pode ser disponibilizado para qualquer implementação.
  • JPL é uma ponte bidirecional Java Prolog que é fornecido com SWI-Prolog por padrão, permitindo Java e Prolog para chamar um ao outro (de forma recursiva). Ele é conhecido por ter um bom suporte concorrência e está em desenvolvimento ativo.
  • InterProlog , uma ponte biblioteca de programação entre Java e Prolog, implementando predicado bi-direcional / método de chamada entre dois idiomas. Objetos Java podem ser mapeados em termos Prolog e vice-versa. Permite o desenvolvimento de GUIs e outras funcionalidades em Java, deixando o processamento da lógica na camada Prolog. Suporta XSB , com suporte para SWI-Prolog e YAP prevista para 2013.
  • Prova fornece integração sintaxe nativa com regras Java, Messaging Agent e reação. Prova posiciona-se como um sistema baseado em regras scripting (RBS) para middleware. A linguagem inova ao combinar imperativo e programação declarativa .
  • PROL Um motor Prolog incorporável para Java. Ele inclui uma pequena IDE e algumas bibliotecas.
  • GNU Prolog para Java é uma implementação da ISO Prolog como uma biblioteca Java (gnu.prolog)
  • Ciao fornece interfaces para C, C ++, Java, e bancos de dados relacionais.
  • C # -Prolog é um interpretador Prolog escrito em (gerenciado) C #. Pode ser facilmente integrado em programas de C #. Características: intérprete confiável e razoavelmente rápido, interface de linha de comando, o Windows de interface, embutido DCG, XML-predicados, SQL-predicados, extensíveis. O código fonte completo está disponível, incluindo um gerador de analisador que pode ser usado para adicionar extensões de propósito específico.
  • Jekejeke Prolog API fornece fortemente acoplados concorrente call-in e instalações entre Prolog e Java ou Android call-out, com a possibilidade marcado para criar objetos da base de conhecimento individuais. Pode ser utilizado para incorporar o intérprete ISO Prolog em Standalones, applets, servlets APK, etc ..
  • A máquina Warren abstrato para PHP compilador A Prolog e intérprete no PHP 5.3. Uma biblioteca que pode ser usado independente ou no quadro Symfony2.1 que foi traduzido a partir de Stephan Buettcher trabalho em Java que pode ser encontrado [aqui Stefan .buettcher .org / cs / WAM / index .html ]

História

O nome Prolog foi escolhido por Philippe Roussel como uma abreviação para programmation en logique ( Francês para programação em lógica ). Foi criado por volta de 1972 por Alain Colmerauer com Philippe Roussel, baseado em Robert Kowalski interpretação processual 's de cláusulas de Horn . Ele foi motivada em parte pelo desejo de conciliar o uso da lógica como uma linguagem de representação do conhecimento declarativa com a representação processual de conhecimento que era popular na América do Norte no final dos anos 1960 e início dos anos 1970. De acordo com Robert Kowalski , o primeiro sistema de Prolog foi desenvolvido em 1972 por Colmerauer e Phillipe Roussel. A primeira implementação de Prolog foi um intérprete escrito em Fortran por Gerard Battani e Henri Meloni. David HD Warren tomou esta intérprete para Edimburgo, e ali implementado um front-end alternativa, que veio para definir a sintaxe “Edinburgh Prolog” usado pela maioria das implementações modernas. Warren também implementou o primeiro compilador para Prolog, criando a influente DEC-10 Prolog em colaboração com Fernando Pereira. Warren mais tarde generalizada as idéias por trás DEC-10 Prolog, para criar a máquina Warren Abstract .

Investigadores europeus AI favorecido Prolog enquanto os americanos favoreceram Lisp , causando alegadamente muitos debates nacionalistas sobre o mérito das línguas. Muito do desenvolvimento moderno da Prolog veio o impulso do projeto de quinta geração Computer Systems (FGCS), que desenvolveu uma variante do Prolog chamado Kernel Idioma para seu primeiro sistema operacional .

Pure Prolog foi originalmente restrito ao uso de uma resolução provador de teoremas com cláusulas de Horn da forma:

H :- B1, ..., Bn.

A aplicação dos mimos teorema-prover as cláusulas procedimentos:

to show/solve H, show/solve B1 and ... and Bn.

Puro Prolog foi rapidamente alargada, no entanto, incluir a negação como falha , em que as condições negativos da forma não (B i ) são mostrados por tentar e não resolver o correspondente condições positivas B i .

Prorrogações subsequentes de Prolog pela equipe original introduzidas programação lógica de restrição habilidades para as implementações.

Use na indústria

Prolog tem sido usada em Watson . Watson usa software DeepQA da IBM eo Apache UIMA -quadro (Unstructured Information Management Architecture). O sistema foi escrito em várias línguas, incluindo Java, C ++, e Prolog, e é executado no SUSE Linux Enterprise Server sistema operacional 11 utilizando Apache Hadoop quadro para fornecer computação distribuída. Prolog é usado para correspondência de padrão sobre árvores de análise de linguagem natural. Os desenvolvedores afirmaram:. "Precisávamos de uma linguagem na qual poderíamos convenientemente expressar regras de correspondência padrão ao longo das árvores de análise e outras anotações (como nomeados os resultados de reconhecimento de entidade), e uma tecnologia que pode executar essas regras de forma muito eficiente Descobrimos que Prolog foi a escolha ideal para o idioma devido à sua simplicidade e expressividade ".

Veja também

línguas relacionadas

  • O Gödel linguagem é uma implementação fortemente tipado de lógica de programação restrição concorrente . Ele é construído sobre SICStus Prolog.
  • Visual Prolog , anteriormente conhecido como PDC Prolog e Turbo Prolog, é uma rigidez de tipos orientada a objectos dialeto de Prolog, que é muito diferente do Prolog padrão. Como Turbo Prolog, foi comercializado pela Borland, mas agora é desenvolvido e comercializado pela firma dinamarquesa PDC (Centro de Desenvolvimento Prolog) que originalmente produziu.
  • Registo de dados é um subconjunto de Prolog. É limitado a relacionamentos que podem ser estratificados e não permite termos compostos. Em contraste com o Prolog, registro de dados não é Turing completo .
  • Mercúrio é um desdobramento do Prolog voltado para engenharia de software na grande com um sistema estático, polimórfica tipo, bem como um sistema de modo e determinismo.
  • GraphTalk é uma implementação proprietária da máquina abstrata de Warren, com propriedades orientadas a objetos adicionais.
  • Em alguns aspectos Prolog é um subconjunto da Planner . As idéias Planner foram posteriormente desenvolvidas na Scientific Comunidade metáfora .
  • AgentSpeak é uma variante de Prolog para o comportamento do agente de programação em sistemas multi-agente .
  • Erlang começou a vida com uma implementação baseada em Prolog e mantém grande parte da sintaxe baseada em unificação do Prolog.
  • Pilog é uma linguagem declarativa construída em cima de PicoLisp , que tem a semântica de Prolog, mas usa a sintaxe de Lisp.

Referências

Outras leituras

links externos

Tutoriais e cursos