伊莎贝尔:前身功能

时间:2013-12-01 23:19:45

标签: isabelle

我不确定,但我认为如果我有一个前任函数,有时我的证明会更容易,例如,如果知道变量不为零。

我不知道一个很好的例子,但也许在这里:{ 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

1 个答案:

答案 0 :(得分:2)

您的定义不必要地复杂化。你为什么不写

def pred ≡ "λn::nat. n - 1"

然后你可以

have [simp]: "⋀n. n > 0 ⟹ Suc (pred n) = n" by (simp add: pred_def)

对于0pred函数只返回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