Ltac模式匹配:为什么`forall x,?P x`不匹配`forall x,x`?

时间:2017-06-04 22:44:18

标签: coq coq-tactic ltac

Ltac checkForall H :=
  let T := type of H in
  match T with
  | forall x, ?P x =>
    idtac
  | _ =>
    fail 1 "not a forall"
  end.

Example test : (forall x, x) -> True.
Proof.
  intros H.
  Fail checkForall H. (* not a forall *)
Abort.

我会天真地期望checkForall H成功,但事实并非如此。

在他的书依赖类型的认证编程中,Adam Chlipala discusses对依赖类型的模式匹配的限制:

  

问题是统一变量可能不包含本地绑定变量。

这是我在这里看到的行为的原因吗?

2 个答案:

答案 0 :(得分:6)

正如larsr所解释的那样,模式?P x只能匹配语法上一个应用程序的术语,这不包括你正在考虑的情况。但是,Ltac确实为您正在寻找的匹配提供了功能。正如user manual所说:

  

对于二阶模式匹配问题,还有一个特殊符号:在@?id id1 …idn形式的应用模式中,变量id匹配变量{{1}中具有(可能)依赖关系的任何复杂表达式并返回id1 …idn形式的函数术语。

因此,我们可以编写以下证明脚本:

fun id1 …idn => term

打印Goal (forall x : Prop, x) -> False. intros H. match goal with | H : forall x : Prop, @?P x |- _ => idtac P end.

答案 1 :(得分:2)

H的类型为forall x, x,而不是forall x, P x

Ltac checkForall H :=
  let T := type of H in
  match T with
  | forall x, ?P x =>
    idtac
  | forall x, x =>
    idtac "this matches"
  | _ =>
    fail 1 "not a forall"
  end.

Example test : (forall x, x) -> True.
Proof.
  intros H.
  checkForall H. (* not a forall *)

Abort.

或匹配您的checkForall

Example test {T} (f:T->Prop)  : (forall x, f x) -> True.
Proof.
  intros H.
  checkForall H.