列表nat的子集在coq中

时间:2016-12-03 12:14:44

标签: coq theorem-proving

我为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

我如何证明这样的定理或解决这个问题?

1 个答案:

答案 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。在您的情况下,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.