Isabelle 利用代数simps实现算术表达式的等价性

Isabelle 利用代数simps实现算术表达式的等价性,isabelle,theorem-proving,Isabelle,Theorem Proving,在练习2.4中,建议对简单的算术表达式使用“代数simps”,表示为“数据类型exp”。有人能举一个例子,如何用代数simps证明这些表达式的一些简单性质吗?例如'Mult a b=Mult b a' 一般来说,我试图证明以类似形式表示的简单算术表达式(具有有限的运算符集)的等价性。如果您已正确定义了eval函数,您可以证明示例中给出的属性,如下所示: lemma Mult_comm: "eval (Mult a b) x = eval (Mult b a) x" by simp 代数\u

在练习2.4中,建议对简单的算术表达式使用“代数simps”,表示为“数据类型exp”。有人能举一个例子,如何用代数simps证明这些表达式的一些简单性质吗?例如'Mult a b=Mult b a'


一般来说,我试图证明以类似形式表示的简单算术表达式(具有有限的运算符集)的等价性。

如果您已正确定义了
eval
函数,您可以证明示例中给出的属性,如下所示:

lemma Mult_comm: "eval (Mult a b) x = eval (Mult b a) x"
  by simp
代数\u simps
只是群和环的基本简化规则的集合(如本例中的整数)。他们与这个特殊的例子无关。您可以通过键入
thm代数\u simps
来查看包含的引理

对于这个特殊的证明,实际上不需要
代数simps
,因为整数乘法的可交换性已经是默认的简化规则

<>所以,为了说明如何使用<代码>代数-SiMPS,考虑一个你确实需要它们的例子:乘法的正确分配性:

lemma Mult_distrib_right: "eval (Mult (Add a b) c) x = eval (Add (Mult a c) (Mult b c)) x"
如果您只是尝试在这个问题上应用simp,您将无法实现目标

(eval a x + eval b x) * eval c x =
  eval a x * eval c x + eval b x * eval c x
幸运的是,规则
代数simps(4)
是这样一条规则:
代数simps(4)
会告诉你这个规则是
(?a+?b)*?c=?a*?c+?b*?c
。如果您告诉Isabelle的简化程序使用
代数\u simps
规则,Isabelle的简化程序将自动应用它,方法是:

apply (simp add: algebra_simps)
而不是

apply simp