Изабель: аксиоматизация и быстрая проверка vs autosolve_direct

Снова небольшой пример с неожиданными результатами.

theory Scratch
imports Main
begin

datatype test = aa | bb | plus test test

axiomatization where
   testIdemo : "x == plus x x"

lemma test1 : "y == plus y y"

Теперь я получаю следующие сообщения:

Auto solve_direct: The current goal can be solved directly with
  Scratch.testIdemo: ?x ≡ test.plus ?x ?x 
Auto Quickcheck found a counterexample:
  y = aa
Evaluated terms:
  test.plus y y = test.plus aa aa

и когда я пытаюсь запустить кувалду, я получаю:

"remote_vampire": Try this: using testIdemo by auto (0.0 ms). 
"spass": The prover derived "False" from "test.distinct(5)" and "testIdemo". 
This could be due to inconsistent axioms (including "sorry"s) or to a bug in Sledgehammer. 
If the problem persists, please contact the Isabelle developers.

Это из-за того, что я возился с ==? Или мне нужно установить какое-то другое ограничение для моих аксиом?

Следовать за:

Очевидно, я не должен играть с равными: P Так что мне нужно определить свое собственное отношение.

axiomatization
testEQ ::  "test ⇒ test ⇒ bool" (infixl "=" 1)
  where
reflexive [intro]: "x = x" and
substitution [elim]: "x = y ⟹ B x = B y" and
symmetric : "x = y ⟹ y = x"

Итак, я думаю, мне нужно определить мои основные свойства. рефлексивность, подстановка и симметрия кажутся хорошими для начала. Я мог бы сделать его общим с помощью 'a => 'a => bool

теперь я бы пошел дальше, чтобы определить больше моего отношения. чтобы остаться с примером:

axiomatization
  plus :: "test⇒ test⇒ test" (infixl "+" 35)
where
  commutative:  "x + y         = y + x"  and
  idemo:  "x + x           = x"  

а) Это пока правильно б) Как действовать дальше Пока я не думаю, что это заменит подтермины из лемм, что является своего рода точкой эквивалентности.


person TKler    schedule 10.01.2016    source источник


Ответы (1)


Ваша аксиома подразумевает, например. aa = plus aa aa, что неверно, поскольку конструкторы типа данных всегда различны по конструкции. (ср. thm test.distinct)

На самом деле, если вы используете axiomatization, вы действительно должны знать, что делаете — таким образом очень легко внести несоответствия. (очевидно)

Если вы хотите иметь тип с определенными свойствами, вы должны его сконструировать. Например, вы можете определить тип представления вашего типа (например, как тип данных), затем определить для него некоторое отношение равенства (т. е. какие значения должны быть равны каким другим значениям), а затем определить «реальный» тип как частный тип вашего типа представления над этим отношением.

person Manuel Eberl    schedule 10.01.2016
comment
Понятно, не могли бы вы указать мне на пример такой конструкции? или немного расширить, как отношения справедливости? - person TKler; 11.01.2016
comment
Это зависит от того, что именно вы хотите сделать. Вы можете посмотреть stackoverflow.com/questions/23478260/ и www21. in.tum.de/~kuncar/huffman-kuncar-itp2012.pdf . Если вы можете более подробно объяснить, что вы хотите сделать в этом или последующем вопросе, я с удовольствием попытаюсь помочь вам в этом. - person Manuel Eberl; 11.01.2016
comment
Спасибо за предложение. я добавил свою попытку создать отношение равенства. Сейчас я читаю www4.in.tum.de/~urbanc /Publications/sac-11.pdf, что немного сложнее, чем kuncar-huffman. - person TKler; 11.01.2016