我为coq中的nat_list的所有子集定义了递归函数
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
#define size 4
int main(){
int A[SIZE][size]={0};
int B[SIZE][size];
int x;
int i;
int j;
for(i = 0; i < SIZE; i++){
for(j = 0; j < size; j++){
for(x = 1; x < 40; x = x + 2){
A[i][j] = x;
printf("%d\n", A[i][j]);
}
}
}
return 0;
}
我想证明
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
我如何证明这样的定理或解决这个问题?
答案 0 :(得分:4)
in_app_or
的问题是具有以下类型:
forall (A : Type) (l m : list A) (a : A),
In a (l ++ m) -> In a l \/ In a m
并且将lemmas应用于目标“向后”:Coq将蕴涵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.