В моей теории у меня есть несколько более крупных определений, из которых я получаю некоторые простые свойства, используя леммы.Условные правила перезаписи с неизвестными в состоянии
Моя проблема заключается в том, что лемы для получения свойств не используются упростителем, и я должен их вручную создавать. Есть ли способ сделать это более автоматическим?
Минимальный пример показан ниже:
definition complexFact :: "int ⇒ int ⇒ int ⇒ bool" where
"complexFact x y z ≡ x = y + z"
lemma useComplexFact: "complexFact x y z ⟹ x = y + z"
by (simp add: complexFact_def)
lemma example_1:
assumes cf: "complexFact a b c"
shows "a = b + c"
apply (simp add: cf useComplexFact) (* easy, works *)
done
lemma example_2a:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: cf useComplexFact) (* does not work *)
oops
lemma example_2b:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: useComplexFact[OF cf]) (* works *)
done
lemma example_2c:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (subst useComplexFact) (* manually it also works*)
apply (subst cf)
apply simp+
done
я нашел следующий пункт в справочном руководстве, так что я думаю, я мог бы решить мою проблему с помощью пользовательского решателя. Тем не менее, я никогда не касался внутренней части ML Изабель и не знаю, с чего начать.
Переписывание не создает неизвестные. Например, переписывание в одиночку не может доказать a ∈? A, поскольку для этого требуется создание экземпляра? A. Решатель , однако, является произвольной тактикой и может создавать неизвестные , как это угодно. Это единственный способ, которым Упрощенный может обрабатывать правило условного перезаписи , условие которого содержит дополнительные переменные.
Спасибо. Почему решатель предположений не работает в следующем подходе, например, 2: 'using cf apply (simp add: useComplexFact [where x = a])'. Я сделал постоянную левую сторону, а simp_trace показывает «[0] Добавление правила перезаписи« ??. Unknown »: complexFact a? Y1? Z1 ⟹ a ≡? Y1 +? Z1'. Однако решатель предположений не создает экземпляры неизвестных? – peq
'simp add: useComplexFact [where x = a]' не работает, результирующее правило перезаписи является 'complexFact a? Y? Z ==> a =? Y +? Z'. Поэтому, когда упроститель видит 'a' и пытается использовать это правило на нем, он должен решить условие' complexFact a? Y? Z'. Поскольку упроститель сначала вызывает себя перед любым решателем, он пытается работать над этим условием и содержит 'a'. Таким образом, он пытается снова использовать одно и то же правило условного перезаписи, пока не будет достигнут предел глубины упрощения, и упрощение отменяет всю цепочку условных перезаписываний (в ускорителе нет возврата). –