如何在ltac中使用类型参数?

时间:2019-04-01 20:37:34

标签: coq coq-tactic

我正在尝试编写以下函数:

Ltac restore_dims :=
  repeat match goal with
  | [ |- context[@Mmult ?m ?n ?o ?A ?B]] => let Matrix m' n' := type of A in 
                                           let Matrix n'' o' := type of B in 
                                           replace m with m' by easy
         end.

也就是说,我想在Ltac中使用有关A和B类型的信息(它们都是带有2维参数的矩阵)。这可能吗?如果可以,怎么办?

(理想情况下,这将用m来代替有问题的m',对于我目标中的所有矩阵乘积,同样将no都替换掉)。

1 个答案:

答案 0 :(得分:4)

您可以对type of A进行语法匹配以提取参数。

Ltac restore_dims :=
  repeat match goal with
  | [ |- context[@Mmult ?m ?n ?o ?A ?B]] =>
        match type of A with
        |  Matrix ?m' ?n' => replace m with m' by easy
        end;
        match type of B with
        |  Matrix ?n'' ?o' => replace n with n'' by easy
          (* or whatever you wanted to do with n'' and o' *)
        end
  end.

如果您认为mm'是可转换的,而不仅是相等的,并且您在乎拥有很好的证明条件,请考虑使用策略change而不是replace例如change n'' with n。这不会在证明词上添加任何内容,因此使用起来可能会更容易。