Lógica polissortida

De testwiki
Ir para a navegação Ir para a procura

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: 𝑝𝑙𝑎𝑛𝑡 and 𝑎𝑛𝑖𝑚𝑎𝑙. Enquanto uma função 𝑚𝑜𝑡ℎ𝑒𝑟:𝑎𝑛𝑖𝑚𝑎𝑙𝑎𝑛𝑖𝑚𝑎𝑙 faz sentido, uma função similar 𝑚𝑜𝑡ℎ𝑒𝑟:𝑝𝑙𝑎𝑛𝑡𝑝𝑙𝑎𝑛𝑡 usualmente não faz não faz. Lógica polissortida permite um ter termos como 𝑚𝑜𝑡ℎ𝑒𝑟(𝑙𝑎𝑠𝑠𝑖𝑒), mas discartar termos como 𝑚𝑜𝑡ℎ𝑒𝑟(<mrow data-mjx-texclass="ORD">𝑚𝑦<mi mathvariant="normal">_</mi>𝑓𝑎𝑣𝑜𝑟𝑖𝑡𝑒<mi mathvariant="normal">_</mi>𝑜𝑎𝑘</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

𝑑𝑜𝑔𝑐𝑎𝑟𝑛𝑖𝑣𝑜𝑟𝑒,
𝑑𝑜𝑔𝑚𝑎𝑚𝑚𝑎𝑙,
𝑐𝑎𝑟𝑛𝑖𝑣𝑜𝑟𝑒𝑎𝑛𝑖𝑚𝑎𝑙,
𝑚𝑎𝑚𝑚𝑎𝑙𝑎𝑛𝑖𝑚𝑎𝑙,
𝑎𝑛𝑖𝑚𝑎𝑙𝑐𝑟𝑒𝑎𝑡𝑢𝑟𝑒,
𝑝𝑙𝑎𝑛𝑡𝑐𝑟𝑒𝑎𝑡𝑢𝑟𝑒,

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 𝑚𝑜𝑡ℎ𝑒𝑟:𝑎𝑛𝑖𝑚𝑎𝑙𝑎𝑛𝑖𝑚𝑎𝑙, e uma declaração constante 𝑙𝑎𝑠𝑠𝑖𝑒:𝑑𝑜𝑔, o termo 𝑚𝑜𝑡ℎ𝑒𝑟(𝑙𝑎𝑠𝑠𝑖𝑒) é perfeitamente válido e tem o tipo 𝑎𝑛𝑖𝑚𝑎𝑙. 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 𝑚𝑜𝑡ℎ𝑒𝑟:𝑑𝑜𝑔𝑑𝑜𝑔pode 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 𝑙𝑖𝑠𝑡(X) pode ser declarado (with X sendo um tipo paramétrico como em um template C++), e de uma declaração de subtipo 𝑖𝑛𝑡𝑓𝑙𝑜𝑎𝑡 a relação 𝑙𝑖𝑠𝑡(𝑖𝑛𝑡)𝑙𝑖𝑠𝑡(𝑓𝑙𝑜𝑎𝑡) é 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 𝑒𝑣𝑒𝑛𝑖𝑛𝑡 e 𝑜𝑑𝑑𝑖𝑛𝑡, uma declaração de termo como i:𝑖𝑛𝑡.(i+i):𝑒𝑣𝑒𝑛 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