如何在引理证明后立即制作一个例子来测试 rev_app 。自定义引理的起始示例
how to make an example to test the rev_app immediately after lemma proved. an starting example for custom lemma
期望将子目标用于运行 let 定义的列表? AA = [1,2]
和 运行 rev_app 在此 aa 上并将值显示为 [2,1]
theory Scratch2
imports Datatype
begin
datatype 'a list = Nil ("[]")
| Cons 'a "'a list" (infixr "#" 65)
(* This is the append function: *)
primrec app :: "'a list => 'a list => 'a list" (infixr "@" 65)
where
"[] @ ys = ys" |
"(x # xs) @ ys = x # (xs @ ys)"
primrec rev :: "'a list => 'a list" where
"rev [] = []" |
"rev (x # xs) = (rev xs) @ (x # [])"
primrec itrev :: "'a list => 'a list => 'a list" where
"itrev [] ys = ys" |
"itrev (x#xs) ys = itrev xs (x#ys)"
value "rev (True # False # [])"
lemma app_Nil2 [simp]: "xs @ [] = xs"
apply(induct_tac xs)
apply(auto)
done
lemma app_assoc [simp]: "(xs @ ys) @ zs = xs @ (ys @ zs)"
apply(induct_tac xs)
apply(auto)
done
(第 1 次试验)
lemma rev_app [simp]: "rev(xs @ ys) = (rev ys) @ (rev xs)"
apply(induct_tac xs)
thus ?aa by rev_app
show "rev_app [1; 2]"
(二审)
value "rev_app [1,2]"
(第三次审判)
fun ff :: "'a list ⇒ 'a list"
where "rev(xs @ ys) = (rev ys) @ (rev xs)"
value "ff [1,2]"
thus ?aa by rev_app
show "rev_app [1; 2]"
end
首先,你需要列表枚举的语法(我刚刚在 src/HOL/List.thy 文件中找到它):
syntax
-- {* list Enumeration *}
"_list" :: "args => 'a list" ("[(_)]")
translations
"[x, xs]" == "x#[xs]"
"[x]" == "x#[]"
那么,以下是您要搜索的内容之一吗?
命题 1:
lemma example1: "rev [a, b] = [b, a]"
by simp
这个引理是通过应用方法simp使用的rev
的定义规则来证明的,以重写左手项并证明等式的两侧相等。这是我更喜欢的解决方案,因为即使不使用 Isabelle 对其进行评估,您也可以看到该示例令人满意。
命题 2:
value "rev [a, b]" (* return "[b, a]" *)
这里和命题3中,我们只是使用命令value
来计算rev
。
命题 3:
value "rev [a, b] = [b, a]" (* returns "True" *)
前面的命题没有用到这个引理:
lemma rev_app [simp]: "rev(xs @ ys) = (rev ys) @ (rev xs)"
apply (induct_tac xs)
by simp_all
备注:
- 作为一般原则,您不应单独导入 "Datatype" 包,而应导入 "Main"。
- 在您的第一次尝试中,您混合了 "apply"(应用...)和 "structured proof"(因此...)样式
- "thus ?aa" 如果 "?aa" 是 "[1,2]" 是没有意义的,因为 "thus" 的参数应该是一个子目标,即。具有布尔值的命题。
- 为了评估,命令 "value" 使用 ML 执行,或者如果失败,则通过评估进行归一化。
- 在示例 1 中,您可以使用自定义证明和引理(例如:by (simp add:rev_app)
期望将子目标用于运行 let 定义的列表? AA = [1,2] 和 运行 rev_app 在此 aa 上并将值显示为 [2,1]
theory Scratch2
imports Datatype
begin
datatype 'a list = Nil ("[]")
| Cons 'a "'a list" (infixr "#" 65)
(* This is the append function: *)
primrec app :: "'a list => 'a list => 'a list" (infixr "@" 65)
where
"[] @ ys = ys" |
"(x # xs) @ ys = x # (xs @ ys)"
primrec rev :: "'a list => 'a list" where
"rev [] = []" |
"rev (x # xs) = (rev xs) @ (x # [])"
primrec itrev :: "'a list => 'a list => 'a list" where
"itrev [] ys = ys" |
"itrev (x#xs) ys = itrev xs (x#ys)"
value "rev (True # False # [])"
lemma app_Nil2 [simp]: "xs @ [] = xs"
apply(induct_tac xs)
apply(auto)
done
lemma app_assoc [simp]: "(xs @ ys) @ zs = xs @ (ys @ zs)"
apply(induct_tac xs)
apply(auto)
done
(第 1 次试验)
lemma rev_app [simp]: "rev(xs @ ys) = (rev ys) @ (rev xs)"
apply(induct_tac xs)
thus ?aa by rev_app
show "rev_app [1; 2]"
(二审)
value "rev_app [1,2]"
(第三次审判)
fun ff :: "'a list ⇒ 'a list"
where "rev(xs @ ys) = (rev ys) @ (rev xs)"
value "ff [1,2]"
thus ?aa by rev_app
show "rev_app [1; 2]"
end
首先,你需要列表枚举的语法(我刚刚在 src/HOL/List.thy 文件中找到它):
syntax
-- {* list Enumeration *}
"_list" :: "args => 'a list" ("[(_)]")
translations
"[x, xs]" == "x#[xs]"
"[x]" == "x#[]"
那么,以下是您要搜索的内容之一吗?
命题 1:
lemma example1: "rev [a, b] = [b, a]"
by simp
这个引理是通过应用方法simp使用的rev
的定义规则来证明的,以重写左手项并证明等式的两侧相等。这是我更喜欢的解决方案,因为即使不使用 Isabelle 对其进行评估,您也可以看到该示例令人满意。
命题 2:
value "rev [a, b]" (* return "[b, a]" *)
这里和命题3中,我们只是使用命令value
来计算rev
。
命题 3:
value "rev [a, b] = [b, a]" (* returns "True" *)
前面的命题没有用到这个引理:
lemma rev_app [simp]: "rev(xs @ ys) = (rev ys) @ (rev xs)"
apply (induct_tac xs)
by simp_all
备注:
- 作为一般原则,您不应单独导入 "Datatype" 包,而应导入 "Main"。
- 在您的第一次尝试中,您混合了 "apply"(应用...)和 "structured proof"(因此...)样式
- "thus ?aa" 如果 "?aa" 是 "[1,2]" 是没有意义的,因为 "thus" 的参数应该是一个子目标,即。具有布尔值的命题。
- 为了评估,命令 "value" 使用 ML 执行,或者如果失败,则通过评估进行归一化。
- 在示例 1 中,您可以使用自定义证明和引理(例如:by (simp add:rev_app)