如何使用局部变量实例化变量(?8758)?

时间:2015-01-27 12:39:48

标签: coq

我当前的证明状态:

 ...
 qu := 1 : Z
 ============================
  (array_at_ tint sh 0 100 (eval_id _busybits rho) *
   array_at tint sh (fun x : Z => Vint (Int.repr (keys m x))) 0 100
     (eval_id _keys rho) *
   array_at tint sh (fun x : Z => Vint (Int.repr (values m x))) 0 100
     (eval_id _values rho))%logic
  |-- !!(offset_val (Int.repr (sizeof tint * ?8758)) (eval_id _busybits rho) =
         force_val
           (sem_add_pi tint (eval_id _busybits rho) (eval_id _index rho)) /\
         0 <= ?8758 /\ ?8758 < 100 /\ Vint (Int.repr 1) = Vint (Int.repr 1))

我可以使用任何整数实例化变量?8758:

  

实例化(2:= 1)。

  (array_at_ tint sh 0 100 (eval_id _busybits rho) *
   array_at tint sh (fun x : Z => Vint (Int.repr (keys m x))) 0 100
     (eval_id _keys rho) *
   array_at tint sh (fun x : Z => Vint (Int.repr (values m x))) 0 100
     (eval_id _values rho))%logic
  |-- !!(offset_val (Int.repr (sizeof tint * 1)) (eval_id _busybits rho) =
         force_val
           (sem_add_pi tint (eval_id _busybits rho) (eval_id _index rho)) /\
         0 <= 1 /\ 1 < 100 /\ Vint (Int.repr 1) = Vint (Int.repr 1))

但是当我尝试使用局部变量实例化它时:

  

实例化(2:= qu)。

我收到一条错误消息:

Toplevel input, characters 38-40:
Error: Instance is not well-typed in the environment of ?8758

为什么我不能用变量实例化它?

编辑:

  

实例化(2:= 1%Z)。

与(2:= 1)的工作方式相同。

存在:(响应@Vinz)

  

显示存在感。

Existential 1 =
?9091 : [Espec : OracleKind
         sh : share
         m : ArrMapZ
         key : Z
         val : Z
         vkey : Values.val
         vval : Values.val
         H : repr key vkey
         H0 : repr val vval
         H4 : writable_share sh
         Struct_env := abbreviate : type_id_env.type_id_env
         bbarg : name _busybits
         ksarg : name _keys
         valsarg : name _values
         karg : name _key
         startloc : name _start
         indexloc : name _index
         startloc0 : Values.val
         indexloc0 : Values.val
         Delta := abbreviate : tycontext
         MORE_COMMANDS := abbreviate : statement
         rho : environ
         H5 : None <> find_empty m (loop key) 99
         H1 : isptr (eval_id _busybits rho)
         H2 : isptr (eval_id _keys rho)
         H3 : isptr (eval_id _values rho)
         POSTCONDITION := abbreviate : ret_assert
         H6 : Vint
                (Int.repr
                   match find_empty m (loop key) 99 with
                   | Some x => x
                   | None => -1
                   end) = eval_id _index rho
         qu := 1 : Z
        |- (array_at_ tint sh 0 100 (eval_id _busybits rho) *
            array_at tint sh (fun x : Z => Vint (Int.repr (keys m x))) 0 100
              (eval_id _keys rho) *
            array_at tint sh (fun x : Z => Vint (Int.repr (values m x))) 0
              100 (eval_id _values rho))%logic
           |-- !!(offset_val (Int.repr (sizeof tint * ?8758))
                    (eval_id _busybits rho) =
                  force_val
                    (sem_add_pi tint (eval_id _busybits rho)
                       (eval_id _index rho)) /\
                  0 <= ?8758 /\ ?8758 < 100 /\ ?8759 = Vint (Int.repr 1))] 
Existential 2 =
?9089 : [Espec : OracleKind
         sh : share
         m : ArrMapZ
         key : Z
         val : Z
         vbb : Values.val
         vkeys : Values.val
         vvals : Values.val
         vkey : Values.val
         vval : Values.val
         H : repr key vkey
         H0 : repr val vval
         H1 : isptr vbb
         H2 : isptr vkeys
         H3 : isptr vvals
         H4 : writable_share sh
         Struct_env := abbreviate : type_id_env.type_id_env
         bbarg : name _busybits
         ksarg : name _keys
         valsarg : name _values
         karg : name _key
         startloc : name _start
         indexloc : name _index
         startloc0 : Values.val
         indexloc0 : Values.val
         vindex := Vint
                     (Int.repr
                        match find_empty m (loop key) 99 with
                        | Some x => x
                        | None => -1
                        end) : Values.val
         Delta := abbreviate : tycontext
         POSTCONDITION := abbreviate : ret_assert
         MORE_COMMANDS := abbreviate : statement
        |- semax Delta
             (PROP  (None <> find_empty m (loop key) 99)
              LOCAL  (`(eq vindex) (eval_id _index);
              `(eq vbb) (eval_id _busybits); `(eq vkeys) (eval_id _keys);
              `(eq vvals) (eval_id _values))
              SEP 
              (`(array_at tint sh
                   (upd
                      (fun x : Z =>
                       Vint (Int.repr (if busybits m x then 1 else 0))) 
                      ?8758 ?8759) 0 100)
                 (fun _ : lift_S (LiftEnviron mpred) => vbb);
              `(array_at tint sh (fun x : Z => Vint (Int.repr (keys m x))) 0
                  100 vkeys);
              `(array_at tint sh (fun x : Z => Vint (Int.repr (values m x)))
                  0 100 vvals)))
             (Ssequence
                (Sassign
                   (Ederef
                      (Ebinop Oadd (Etempvar _keys (tptr tint))
                         (Etempvar _index tint) (tptr tint)) tint)
                   (Etempvar _key tint)) MORE_COMMANDS) POSTCONDITION] 
Existential 3 =
?8759 : [Espec : OracleKind
         sh : share
         m : ArrMapZ
         key : Z
         val : Z
         vbb : Values.val
         vkeys : Values.val
         vvals : Values.val
         vkey : Values.val
         vval : Values.val
         H : repr key vkey
         H0 : repr val vval
         H1 : isptr vbb
         H2 : isptr vkeys
         H3 : isptr vvals
         H4 : writable_share sh
         Struct_env := abbreviate : type_id_env.type_id_env
         bbarg : name _busybits
         ksarg : name _keys
         valsarg : name _values
         karg : name _key
         startloc : name _start
         indexloc : name _index
         startloc0 : Values.val
         indexloc0 : Values.val
         vindex := Vint
                     (Int.repr
                        match find_empty m (loop key) 99 with
                        | Some x => x
                        | None => -1
                        end) : Values.val
         Delta := abbreviate : tycontext
         MORE_COMMANDS := abbreviate : statement |- 
        reptype tint] 
Existential 4 =
?8758 : [Espec : OracleKind
         sh : share
         m : ArrMapZ
         key : Z
         val : Z
         vbb : Values.val
         vkeys : Values.val
         vvals : Values.val
         vkey : Values.val
         vval : Values.val
         H : repr key vkey
         H0 : repr val vval
         H1 : isptr vbb
         H2 : isptr vkeys
         H3 : isptr vvals
         H4 : writable_share sh
         Struct_env := abbreviate : type_id_env.type_id_env
         bbarg : name _busybits
         ksarg : name _keys
         valsarg : name _values
         karg : name _key
         startloc : name _start
         indexloc : name _index
         startloc0 : Values.val
         indexloc0 : Values.val
         vindex := Vint
                     (Int.repr
                        match find_empty m (loop key) 99 with
                        | Some x => x
                        | None => -1
                        end) : Values.val
         Delta := abbreviate : tycontext
         MORE_COMMANDS := abbreviate : statement |- Z] 

Coq 8.4pl3

2 个答案:

答案 0 :(得分:2)

我认为这里发生的事情是qu不在你的存在变量的背景中。

您会看到,每次创建存在变量时,它都会继承当前上下文(a.k.a. environment),并且不能由包含不在该上下文中的变量的术语进行实例化。这是为了防止某些形式的循环推理,但我想在你的情况下它太严格了。

Goal forall P, exists x : False, P x -> False -> False.
Proof.
intros.
eexists.
intros H1 H2.
instantiate (1 := H2) in H1.
exact H2.
Qed.

您需要在创建存在主义之前定义qu

答案 1 :(得分:1)

感谢您的反馈。我认为你的问题是你没有实例化正确的变量,但你得到一个实例化的副作用?8758。 如果你看一下Show Existentials的输出,你会看到它?8758不是第二个变量而是第四个变量,而第二个变量是一个令人毛骨悚然的巨大类型,而第四个是{{1}类型}。

Z是否解决了您的问题?