我正在使用图书馆HOL/Library/Polynomial.thy
。
一个简单的财产不起作用。例如,2x *2
的程度等于2x
-
如何证明引理(即删除“抱歉”):
lemma mylemma:
fixes y :: "('a::comm_ring_1 poly)" and x :: "('a::comm_ring_1)"
shows "1 = 1" (* dummy *)
proof-
have "⋀ x. degree [: x :] = 0" by simp
from this have "⋀ x y. degree (y * [: x :] ) = degree y" sorry
(* different notation: *)
from this have "⋀ x y. degree (y * (CONST pCons x 0)) = degree y" sorry
。
根据Manuel的回答,我一直在寻找解决方案:
have 1: "⋀ x. degree [: x :] = 0" by simp
{
fix y :: "('a::comm_ring_1 poly)" and x :: "('a::comm_ring_1)"
from 1 have "degree (y * [: x :]) ≤ degree y"
by (metis Nat.add_0_right degree_mult_le)
}
答案 0 :(得分:2)
这里有很多问题。
首先,您尝试展示的声明并不适用于所有x
。如果x = 0
和y
是非常数,例如y = [:0,1:]
,你有
degree (y * [: x :]) = degree 0 = 0 ≠ 1 = degree y
解决这个问题的明显方法是假设x ≠ 0
。
然而,这也不够,因为你只假设'a
是一个可交换的环。但是,在一个可交换的环中,一般来说,你可以有零除数。考虑交换环ℤ/4ℤ
。设x = 2
和y = [:0,2:]
。
然后是y * [:x:] = [:0,4:]
,4 = 0
ℤ/4ℤ
。因此y * [:x:] = 0
,因此,再次
degree (y * [: x :]) = degree 0 = 0 ≠ 1 = degree y
所以,你真正需要的是以下两种之一:
x ≠ 0
和'a :: idom而不是'a :: comm_ring。 idom代表“积分域”,它只是一个带有1且没有零除数的可交换环x
不是零除数x * y ≠ 0
或等同于x
乘以y的领先系数不是0 另外,在Isar样张中使用is有时会有些问题。 Isar的“正确”方式是:
fix x :: "'a::idom" and y :: "'a poly"
assume "x ≠ 0"
hence "degree (y * [:x:]) = degree y" by simp
相关的引理是degree_mult_eq
和degree_smult_eq
,您会看到它们需要系数类型为idom。这适用于我上面描述的第一种情况,另外两种情况需要更多的手动推理,我认为。
编辑:只是一个小提示:你可以通过输入
找到这样的定理find_theorems "degree (_ * _)"
如果您尝试将其显示的degree_mult_eq
应用于您的情况(使用comm_ring),您会发现它失败了,即使条款似乎匹配。如果是这种情况,通常是类型问题,因此您可以编写类似
from [[show_sorts]] degree_mult_eq
查看引理所需的类型和排序,并说idom
。