我想出了以下玩具校对脚本:
Inductive myType : Type :=
| c : unit -> myType.
Inductive myProp : myType -> Type :=
| d : forall t, myProp (c t).
Hint Constructors myProp.
Definition myValue : myType := c tt.
Hint Unfold myValue.
Example test: myProp myValue.
Proof.
auto 1000. (* does nothing *)
unfold myValue.
trivial.
Qed.
为什么我需要在这里手动展开myValue
?该暗示不应该足够吗?
答案 0 :(得分:4)
那是因为(见refman)
此[
Hint Unfold <qualid>
]将提示unfold qualid
添加到提示列表中,该提示列表仅在目标的头部常量为ident时使用。
目标myProp myValue
的头部位置myProp
,而不是myValue
。
有几种方法可以解决这个问题:
Hint Extern 4 => constructor. (* change 4 with a cost of your choice *)
或
Hint Extern 4 => unfold myValue.
甚至
Hint Extern 1 =>
match goal with
| [ |- context [myValue]] => unfold myValue
end.
答案 1 :(得分:3)
@AntonTrunov在他解释为什么Hint Unfold
未在这里使用时是正确的。有一个替代Hint Transparent
使得应用程序以某些特定常量为模三角形。好像trivial
和auto
尚不支持,但eauto
支持您,如下所示:
Inductive myType : Type :=
| c : unit -> myType.
Inductive myProp : myType -> Type :=
| d : forall t, myProp (c t).
Hint Constructors myProp.
Definition myValue : myType := c tt.
Hint Transparent myValue.
Example test: myProp myValue.
Proof.
eauto.
Qed.