在Programming and Proving in Isabelle/HOL中,练习2.4建议在简单的算术表达式上使用'algebra_simps',表示为'datatype exp'。有人可以举例说明如何使用algebra_simps证明这些表达式的一些简单属性吗?例如'Mult a b = Mult b a'?
总的来说,我试图证明以类似形式表示的简单算术表达式的等价性(使用有限的运算符集)。
答案 0 :(得分:2)
如果您已正确定义了eval
功能,则可以在此示例中证明您提供的属性:
lemma Mult_comm: "eval (Mult a b) x = eval (Mult b a) x"
by simp
algebra_simps
只是组和环的基本简化规则的集合(例如整数,在本例中)。它们与这个特定的例子无关。您可以通过键入thm algebra_simps
来查看包含的词条。
对于这个特定的证明,你实际上并不需要algebra_simps
,因为整数乘法的可交换性无论如何都已经是默认的简化规则。
因此,为了展示如何使用algebra_simps
,请考虑一个您确实需要它们的示例:正确的乘法分布:
lemma Mult_distrib_right: "eval (Mult (Add a b) c) x = eval (Add (Mult a c) (Mult b c)) x"
如果你只是尝试apply simp
,你就会陷入目标
(eval a x + eval b x) * eval c x =
eval a x * eval c x + eval b x * eval c x
幸运的是,规则algebra_simps(4)
是一条规则:thm algebra_simps(4)
会告诉您此规则为(?a + ?b) * ?c = ?a * ?c + ?b * ?c
。 Isabelle的简化器将自动应用它,如果您告诉它使用algebra_simps
规则,请执行以下操作:
apply (simp add: algebra_simps)
而不是
apply simp