簡體   English   中英

Coq中的列表nat的子集

[英]Subsets of list nat in coq

我為coq中的nat_list的所有子集定義了一個遞歸函數,如下所示:

Fixpoint subsets (a: list nat) : (list (list nat)) :=
 match a with
  |[] => [[]]
  |h::t => subsets t ++ map (app [h]) (subsets t)
end.

我試圖證明

forall (a:list nat), In [] (subsets a).

我試圖上一個。 基本情況是直接的。 但是在歸納情況下,我嘗試使用內置定理in_app_or

Unable to unify "In ?M1396 ?M1394 \/ In ?M1396 ?M1395" with
"(fix In (a : list nat) (l : list (list nat)) {struct l} : Prop := 

match l with
| [] => False
| b :: m => b = a \/ In a m     
end)                                                         
[] (subsets t ++ map (fun m : list nat => h :: m) (subsets t))".

我如何證明這樣的定理或解決這樣的問題?

in_app_or的問題在於它具有以下類型:

forall (A : Type) (l m : list A) (a : A),
  In a (l ++ m) -> In a l \/ In a m

引理在目標上的應用是“向后的”:Coq將含義A -> B的結果B A -> B與目標匹配,如果可以統一,您將得到一個新的目標:您需要證明(更強)陳述A 而且在您的情況下, AB的順序錯誤(交換),因此您需要應用in_or_app

in_or_app : forall (A : Type) (l m : list A) (a : A),
  In a l \/ In a m -> In a (l ++ m)

這就是使用in_or_app可以證明您的目標的方式:

Goal forall (a:list nat), In [] (subsets a).
  intros.
  induction a; simpl; auto.
  apply in_or_app; auto.
Qed.

暫無
暫無

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

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