我不确定,但我认为如果我有一个前任函数,有时我的证明会更容易,例如,如果知道变量不为零。
我不知道一个很好的例子,但也许在这里:{ fix n have "(n::nat) > 0 ⟹ (∑i<n. f i) = Predecessor n" sorry }
可能因为它不是一个好主意,库中没有前任功能。
有没有办法模拟前任函数或类似函数?
我想到了这个例子:
theorem dummy:
shows "1=1" (* dummy *)
proof-
(* Predecessor function *)
def pred == "λnum::nat. (∑i∈{ i . Suc i = num}. i)"
{fix n :: nat
from pred_def have "n>0 ⟹ Suc (pred n) = n"
apply(induct n)
by simp_all
}
show ?thesis sorry
qed
答案 0 :(得分:2)
您的定义不必要地复杂化。你为什么不写
def pred ≡ "λn::nat. n - 1"
然后你可以
have [simp]: "⋀n. n > 0 ⟹ Suc (pred n) = n" by (simp add: pred_def)
对于0
,pred
函数只返回0
,而Suc (pred 0) = 0
显然不成立。您还可以定义pred ≡ "λn. THE n'. Suc n' = n"
。如果存在这样的数字(即n
)和n > 0
(即一些你不知道的自然数),那将返回其后继为undefined
的唯一自然数。但是,我认为在这种情况下,只做pred ≡ λn::nat. n - 1
会更容易和明智。
我怀疑在大多数情况下,你可以放弃pred
函数并写n - 1
;但是,我知道有一个定义让- 1
“受保护”有时会很好。在这些情况下,我通常def
变量n'
为n - 1
并证明Suc n' = n
- 基本相同。在我看来,看到证明这只需要一行,它并不值得定义它自己的定义,例如这个pred
函数,但是我想这可以为它做一个合理的例子。
另一件事:我注意到你使用lemma "1 = 1"
作为某种虚拟环境来进行Isar证明。我想指出notepad
的存在,它恰好存在于该用途中案例和可以使用如下:
notepad
begin
have "some fact" by something
end