Это не полный ответ, но вы можете извлечь некоторую полезную информацию из того, что здесь изложено.
В Айсбахе я могу использовать; применить метод ко всем новым подцелям, созданным методом. Однако я часто знаю, сколько подцелей создано, и хотел бы применить различные методы к новым подцелям. Есть ли способ сказать что-то вроде «применить метод X к первой новой подцели и метод Y ко второй новой подцели»?
Вы можете использовать стандартную тактическую RANGE
, чтобы определить свои собственные тактики c, которые вы можете применять к последовательным подзадачам. Ниже я приведу очень специализированный и значительно упрощенный вариант использования:
ML‹
fun mytac ctxt thms = thms
|> map (fn thm => resolve_tac ctxt (single thm))
|> RANGE
›
lemma
assumes A: A and B: B and C: C
shows "A ∧ B ∧ C"
apply(intro conjI)
apply(tactic‹mytac @{context} [@{thm A}, @{thm B}, @{thm C}] 1›)
done
Надеюсь, его будет достаточно легко распространить на более сложные варианты использования (при этом будьте более осторожны, чем я в отношении подцельной индексации: вы можете также необходимо SELECT_GOAL
, чтобы гарантировать, что реализация безопасна). В то время как в приведенном выше примере mytac
принимает список теорем, должно быть легко увидеть, как эти теоремы могут быть заменены тактикой, и с некоторой дальнейшей работой tacti c может быть упакован как метод более высокого порядка.
Я хочу разработать метод, который работает на 2 соединениях произвольной длины, но с одинаковой структурой. Метод должен быть применим, чтобы показать, что конъюнкция 1 подразумевает конъюнкцию 2, показывая, что импликация выполняется для каждого компонента. Его можно использовать следующим образом:
ОБНОВЛЕНИЕ
После еще одного взгляда на проблему кажется, что существует существенно более естественное решение. Решение следует плану из исходного ответа, но мета-импликация заменяется импликацией объекта HOL logi c (преобразование «туда и сюда» может быть достигнуто с использованием atomize (full)
и intro impI
):
lemma arg_imp2: "(a ⟶ b) ⟹ (c ⟶ d) ⟹ ((a ∧ c) ⟶ (b ∧ d))" by auto
lemma example:
assumes "a 0 ∧ a 1 ∧ a 2 ∧ a 3"
and imp: "⋀i. a i ⟹ a' i"
shows "a' 0 ∧ a' 1 ∧ a' 2 ∧ a' 3"
apply(insert assms(1), atomize (full))
apply(intro arg_imp2; intro impI; intro imp; assumption)
done
LEGACY (это было частью исходного ответа, но почти не имеет значения из-за ОБНОВЛЕНИЯ, предложенного выше)
Если это единственное приложение, которое вы имеете в виду, возможно, там является достаточно естественным решением, основанным на следующей итерационной процедуре:
lemma arg_imp2: "(a ⟹ b) ⟹ (c ⟹ d) ⟹ ((a ∧ c) ⟹ (b ∧ d))" by auto
lemma example:
assumes c: "a 0 ∧ a 1 ∧ a 2 ∧ a 3"
and imp: "⋀i. a i ⟹ a' i"
shows "a' 0 ∧ a' 1 ∧ a' 2 ∧ a' 3"
using c
apply(intro arg_imp2[of ‹a 0› ‹a' 0› ‹a 1 ∧ a 2 ∧ a 3› ‹a' 1 ∧ a' 2 ∧ a' 3›])
apply(rule imp)
apply(assumption)
apply(intro arg_imp2[of ‹a 1› ‹a' 1› ‹a 2 ∧ a 3› ‹a' 2 ∧ a' 3›])
apply(rule imp)
apply(assumption)
apply(intro arg_imp2[of ‹a 2› ‹a' 2› ‹a 3› ‹a' 3›])
apply(rule imp)
apply(assumption)
apply(rule imp)
apply(assumption+)
done
Я не уверен, насколько легко было бы express это в Айсбахе, но это должно быть достаточно просто express в Isabelle/ML
.