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

How to instantiate a variable (?8758) with a local variable?

我目前的证明状态:

 ...
 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:

instantiate (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))

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

instantiate (2:=qu).

我收到一条错误消息:

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

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

编辑:

instantiate (2:=1%Z).

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

存在主义:(回应@Vinz)

Show Existentials.

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] 

辅酶 8.4pl3

感谢您的反馈。我认为你的问题是你没有实例化正确的变量,但是你得到了实例化 ?8758 的副作用。 如果您查看 Show Existentials 的输出,您会发现 ?8758 不是第二个变量而是第四个变量,而且第二个变量的类型令人毛骨悚然,而第四个变量的类型为 Z.

instantiate (4 := qu). 是否解决了您的问题?

我认为这里发生的是 qu 不在你的存在变量的上下文中。

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

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