我正在尝试编写以下函数:
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'
,对于我目标中的所有矩阵乘积,同样将n
和o
都替换掉)。
答案 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.
如果您认为m
和m'
是可转换的,而不仅是相等的,并且您在乎拥有很好的证明条件,请考虑使用策略change
而不是replace
例如change n'' with n
。这不会在证明词上添加任何内容,因此使用起来可能会更容易。