Coq:为什么我需要手动展开一个值,即使它有一个“Hint Unfold”?

时间:2017-06-26 19:59:02

标签: coq coq-tactic

我想出了以下玩具校对脚本:

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?该暗示不应该足够吗?

2 个答案:

答案 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使得应用程序以某些特定常量为模三角形。好像trivialauto尚不支持,但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.