Я хочу доказать правильность определения функции, используя определение ключевого слова function
. Вот определение функции сложения по обычному индуктивному определению натуральных чисел:Правильность определения функции проверки в Isabelle
theory FunctionDefinition
imports Main
begin
datatype natural = Zero | Succ natural
function add :: "natural => natural => natural"
where
"add Zero m = m"
| "add (Succ n) m = Succ (add n m)"
Isabelle/JEdit показывает мне следующие подзадачи:
goal (4 subgoals):
1. ⋀P x. (⋀m. x = (Zero, m) ⟹ P) ⟹ (⋀n m. x = (Succ n, m) ⟹ P) ⟹ P
2. ⋀m ma. (Zero, m) = (Zero, ma) ⟹ m = ma
3. ⋀m n ma. (Zero, m) = (Succ n, ma) ⟹ m = Succ (add_sumC (n, ma))
4. ⋀n m na ma. (Succ n, m) = (Succ na, ma) ⟹ Succ (add_sumC (n, m)) = Succ (add_sumC (na, ma))
Auto solve_direct: ⋀m ma. (Zero, m) = (Zero, ma) ⟹ m = ma can be solved directly with
Product_Type.Pair_inject: (?a, ?b) = (?a', ?b') ⟹ (?a = ?a' ⟹ ?b = ?b' ⟹ ?R) ⟹ ?R
с использованием
apply (auto simp add: Product_Type.Pair_inject)
Я получаю
goal (1 subgoal):
1. ⋀P a b. (⋀m. a = Zero ∧ b = m ⟹ P) ⟹ (⋀n m. a = Succ n ∧ b = m ⟹ P) ⟹ P
Непонятно, как действовать. На самом деле, это правильный способ решить эту проблему?
Я знаю, что Изабель сделает это автоматически, если я использую определение fun
- я хочу узнать, как это сделать вручную.
Кроме того, если вы хотите, чтобы доказать завершение вручную, 'применить (отношение R)' очень полезно, где 'r' является вполне обоснованным отношение на аргументы функции, которая говорит, какой из двух аргументов' меньше 'чем другой. Обычно вам нужно использовать 'measure f' как это отношение, где' f' является функцией от типа аргумента функции до 'nat' и в основном сопоставляет аргументы функции с их' size'. –