簡體   English   中英

如何在 Coq 中證明 a*b*c=a*(b*c)?

[英]How to prove a*b*c=a*(b*c) in Coq?

我試圖證明上述問題。 我得到了歸納的定義:

Definition nat_ind 
  (p : nat -> Prop)
  (basis : p 0)
  (step : forall n, p n -> p (S n)) :
    forall n, p n := fix f n :=
      match n return p n with
      | 0 => basis
      | S n => step n (f n)
      end.

這是我的嘗試,但不知道如何完成

Goal forall a b c, a * b * c = a * (b * c).
Proof. 
 apply nat_ind.
  - intros a b c. revert a.
    apply (nat_ind (fun a => a * b * c = a * (b * c))); simpl.
    + reflexivity.
    + intros. f_equal. intros. 

在您第一次調用nat_ind之后,如果您查看您的目標,您會發現 Coq 根本沒有做正確的事情!

______________________________________(1/3)
forall a b c : nat, a * b * c = a * (b * c)
______________________________________(2/3)
nat ->
(forall a b c : nat, a * b * c = a * (b * c)) ->
forall a b c : nat, a * b * c = a * (b * c)
______________________________________(3/3)
nat

這里發生的事情是它猜測了你的動機p ,並決定將它與fun (_: nat) => <YOUR_WHOLE_GOAL>統一起來,一個 function 給出任何nat都會給你的目標......是的,這很愚蠢!

推動它對 a 進行歸納的a方法是明確地強制它這樣做,其中:

apply nat_ind with (n:= a)

(其中n與您的nat_ind定義中使用的名稱匹配)

在此之后,您將獲得更合理的目標:

______________________________________(1/2)
forall b c : nat, 0 * b * c = 0 * (b * c)
______________________________________(2/2)
forall n : nat,
(forall b c : nat, n * b * c = n * (b * c)) ->
forall b c : nat, S n * b * c = S n * (b * c)

其中確實a已分別被0S n取代。

[編輯:我想這並不能完全回答你的問題,因為你已經通過第二次感應電話達到了相同的點......]

為了解決您的目標,擁有一個關於乘法對加法的分布的屬性將有很大幫助:

forall n m p, (n + m) * p = n * p + m * p

所有這些,以及你想要證明的東西,都已經存在於 Coq 中了。 這是作業嗎? 你只是在訓練嗎?

暫無
暫無

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

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