簡體   English   中英

用COQ中的歸納法證明一個定理

[英]Proving a theorem using induction in COQ

我正在學校學習Coq,我有一份工作要做。 我有一個引理來證明:如果一個列表在其元素中包含零,那么它的元素的乘積就是0.我啟動了我的代碼,我陷入了一個我不知道如何繼續的地步。 我不知道Coq的所有命令,我做了很多研究,但是我無法找到證據結束的方法。 這是我的代碼:需要導入列表ZArith。

Open Scope Z_scope.

Fixpoint contains_zero (l : list Z) :=
  match l with
    nil => false
  | a::tl => if Zeq_bool a 0 then true else contains_zero tl
  end.

Fixpoint product (l : list Z) :=
  match l with
    nil => 1
  | a::tl => a * product tl
  end.

Lemma Zmult_integral_r :
  forall n m, m <> 0 -> m * n = 0 -> n = 0.
Proof.
intros n m m0; rewrite Zmult_comm; apply Zmult_integral_l.
assumption.
Qed.

Lemma product_contains_zero :
  forall l, contains_zero l = true -> product l = 0.
intros l H.

所以,我認為創建一個檢查列表是否包含零的函數以及另一個計算其元素的乘積的函數是個好主意。 我還發現(幸運的是)在線引理證明,如果我有2個數字,並且我知道其中一個不是0,而且他們的產品是0,那么其他數字必然是0(我認為這可能有幫助) 。 我想過通過歸納做一個證明,但這沒有用。 有任何想法嗎? 我知道這不是要求某人做我的工作的地方,我不是在問這個,我只是需要一個想法。

1 /你不需要你提到的定理,“如果我有2個數字,我知道其中一個不是0,而且它們的乘積是0,那么其他數字必然是0”。 您不需要它,因為您想要證明產品為0,您不希望使用產品為零的事實。

所以定理Zmult_integral_r對這個問題中的引理沒有用。 如果你必須證明forall l,產品l = 0 - > contains_zero l = true會很有用。

在這里,對於您的問題,您考慮的兩個函數是遞歸的,因此通常的提示是通過歸納進行證明,然后使用策略簡化來使函數看起來更簡單。

將兩個數字的乘積表示為一個數字,同時您將支持該引理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM