HiLog - HiLog

HiLog é uma lógica de programação com sintaxe de ordem superior, que permite que termos arbitrários apareçam em posições de predicado e função. No entanto, a teoria do modelo de HiLog é de primeira ordem. Embora sintaticamente o HiLog estenda estritamente a lógica de primeira ordem , o HiLog pode ser integrado a essa lógica.

HiLog foi descrito pela primeira vez em 1989. Posteriormente, foi estendido na direção da lógica de classificação múltipla .

O sistema XSB analisa a sintaxe HiLog, mas a integração do HiLog no XSB é apenas parcial. Em particular, HiLog não é integrado ao sistema de módulo XSB. Uma implementação completa do HiLog está disponível no sistema Flora-2 .

Foi demonstrado que o HiLog pode ser incorporado à lógica de primeira ordem por meio de uma transformação bastante simples. Por exemplo, p(X)(Y,Z(V)(W))fica embutido como o seguinte termo de primeira ordem: apply(p(X),Y,apply(apply(Z,V),W)).

O Framework for Logic-Based Dialects (RIF-FLD) do Rule Interchange Format (RIF) é amplamente baseado nas ideias subjacentes ao HiLog e ao F-logic .

Exemplos

Em todos os exemplos abaixo, os símbolos em maiúsculas denotam variáveis ​​e a vírgula denota conjunção lógica , como na maioria das linguagens de programação lógica . O primeiro e o segundo exemplos mostram que as variáveis ​​podem aparecer em posições de predicado. Predicados podem até ser termos complexos, como closure(P)ou maplist(F)abaixo. O terceiro exemplo mostra que as variáveis ​​também podem aparecer no lugar de fórmulas atômicas, enquanto o quarto exemplo ilustra o uso de variáveis ​​no lugar de símbolos de função. O primeiro exemplo define um operador de fechamento transitivo genérico , que pode ser aplicado a um predicado binário arbitrário. O segundo exemplo é semelhante. Ele define um operador de mapeamento semelhante ao LISP , que se aplica a um predicado binário arbitrário. O terceiro exemplo mostra que o meta-predicado Prologcall/1 pode ser expresso em HiLog de forma natural e sem o uso de recursos extralógicos. O último exemplo define um predicado que atravessa árvores binárias arbitrárias representadas como termos de primeira ordem .

closure(P)(X,Y) <- P(X,Y).
closure(P)(X,Y) <- P(X,Z), closure(P)(Z,Y).

maplist(F)([],[]).
maplist(F)([X|R],[Y|Z]) <- F(X,Y), maplist(F)(R,Z).

call(X) <- X.

traverse(X(L,R)) <- traverse(L), traverse(R).

Referências

Leitura adicional