[英]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
而且在您的情況下, A
和B
的順序錯誤(交換),因此您需要應用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.