我当前的证明状态:
...
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)的工作方式相同。
显示存在感。
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
答案 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
是否解决了您的问题?