Lógica polissortida

Fonte: testwiki
Revisão em 20h00min de 21 de dezembro de 2023 por imported>Cosmo Skerry (+correções semiautomáticas (v0.57/3.1.56/))
(dif) ← Revisão anterior | Revisão atual (dif) | Revisão seguinte → (dif)
Saltar para a navegação Saltar para a pesquisa

A lógica polissortida pode refletir formalmente a nossa intenção de não lidar com o universo como um conjunto homogêneo de objetos, mas particionar isso de uma maneira que é semelhante aos de tipos em linguagens tipadas. Ambos funcionais e assertivas "partes do discurso" na linguagem da logica refletem essa partição tipificada do universo, mesmo no nível de sintaxe: substituição e argumento de passagem só pode ser feito em conformidade, respeitando os "tipos".

Há mais maneiras de formalizar a intenção acima mencionada; a Lógica polissortida é qualquer pacote de informação que o preenche. Na maioria dos casos, são os seguintes dados:

  • um conjunto de tipos, S
  • uma generalização adequada da noção de assinatura ara ser capaz de lidar com a informação adicional que vem com os tipos.

O universo de discurso de qualquer estrutura dessa assinatura é então fragmentada em subconjuntos dijuntos, um para cada tipo.

Exemplo

Ao refletirmos sobre criaturas biológicas, é útil distinguir dois tipos: plant and animal. Enquanto uma função mother:animalanimal faz sentido, uma função similar mother:plantplant usualmente não faz não faz. Lógica polissortida permite um ter termos como mother(lassie), mas discartar termos como mother(<mrow data-mjx-texclass="ORD">my<mi mathvariant="normal">_</mi>favorite<mi mathvariant="normal">_</mi>oak</mrow>) como sintaticamente mal formado.

Álgebra

A álgebra da lógica polissortida é explicada em um artigo de Caleiro e Gonçalves,[1] que generaliza a lógica algébrica abstrata para o caso polissortido, mas também pode ser usado como material introdutório.

Lógica ordem-sortida

Enquanto Lógica polissortida requer dois diferentes tipos para ter conjuntos universo dijuntos, lógica ordem-sortida permite um tipo s1 para ser declarado como um subtipo de outro tipo. s2, usualmente escrevendos1s2 ou sintaxe similar. No exemplo abaixo, é desejável declarar

dogcarnivore,
dogmammal,
carnivoreanimal,
mammalanimal,
animalcreature,
plantcreature,

e assim por diante.

Onde um termo de um tipo s é requerido, um termo de qualquer subtipo s pode ser fornecido em seu lugar. Por exemplo, assumindo uma declaração de função mother:animalanimal, e uma declaração constante lassie:dog, o termo mother(lassie) é perfeitamente válido e tem o tipo animal. A fim de fornecer as informações de que a mãe de um cão é um cão, por sua vez, uma nova declaração mother:dogdogpode ser emitida; isso é chamado de sobrecarga de funções , semelhante ao Polimorfismo em linguagens de programação.

Lógica ordem-sortida pode ser traduzida em lógica não sortida, usando um predicado unário pi(x) para cada tiposi, e um axioma x:pi(x)pj(x) para cada declaração de subtipo sisj. A abordagem inversa foi bem sucedido na prova de teoremas automatizado: em 1985, Christoph Walther poderia resolver um problema, então referência, traduzindo-a na lógica ordem-sortida, portando fazendo isso uma ordem de magnitude, assim como muitos predicados unários se transformaram em tipos.[2]

A fim de incorporar uma lógica classificados ordem em um teorema automatizado prover baseada em cláusulas, uma correspondente algoritmo de unificação ordem-sortida é necessário,que exige que para quaisquer dois tipos declarados s1,s2 their intersection s1s2 ser declarados, para: se x1 e x2 é im tipo variável s1 e s2, respectivamente, a equação x1=?x2 possui a solução {x1=x,x2=x}, onde x:s1s2.

Smolka generalizou a lógica ordem-sortida para permitir polimorfismo paramétrico. [3][4] IEm seu quadro, declarações de subtipo são propagadas para expressões do tipo complexo. Como um exemplo de programação, um tipo paramétrico list(X) pode ser declarado (with X sendo um tipo paramétrico como em um template C++), e de uma declaração de subtipo intfloat a relação list(int)list(float) é automaticamente inferida, significando que cada lista de inteiros é também uma lista de tipos float.

Schmidt-Schauß generalizou ordem-sortida para permitir a declaração de termos.[5] Como um exemplo, asumindo declarações de subtipos evenint e oddint, uma declaração de termo como i:int.(i+i):even permite declarar uma propriedade de adição de inteiros que não pode ser expressada por poliformismo ordinário.

Predefinição:Referências

Primeiros artigos sobre lógica de muitos tipos incluem:

Ligações externas