作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚发现了最大和非最大参数的存在(见 documentation)。
但是是否有动机使用其中一种?一个比另一个更新吗?最大隐式参数只需要 {}
要创建,而必须使用 Arguments
或 Implicit Arguments
指定非最大值。这是否意味着应该首选最大隐式参数?
最佳答案
... is there some motivation to use one over the other ?
@
禁止插入隐式参数的符号。
Require Import Coq.Lists.List. Import ListNotations.
Section Length.
Variable A:Type.
length
函数具有非 MII 第一个参数:
Print Implicit length.
(*
Output:
length : forall A : Type, list A -> nat
Argument A is implicit
*)
length
没有部分应用,所以
A
没有插入):
Fail Check (fun l:list (list A) => map length l).
Check (fun l:list (list A) => map (@length _) l).
(* or *)
Check (fun l:list (list A) => map (length (A := _)) l).
(* or *)
Check (fun l:list (list A) => map (fun xs => length xs) l).
length
与
(@length _)
:
Arguments length {A} _.
Check (fun l:list (list A) => map length l).
End Length.
Coq.Lists.List
中带有非 MII 参数的工作示例模块:
Set Implicit Arguments. (* non-MII arguments is the default behavior *)
Inductive Forall2 A B (R:A->B->Prop) : list A -> list B -> Prop :=
| Forall2_nil : Forall2 R [] []
| Forall2_cons : forall x y l l',
R x y -> Forall2 R l l' -> Forall2 R (x::l) (y::l').
Theorem Forall2_refl : forall A B (R:A->B->Prop), Forall2 R [] [].
Proof. exact Forall2_nil. Qed.
exact Forall2_nil
在 MII 参数的情况下不起作用。
constructor
不过会帮助我们:
Arguments Forall2_nil {A B} _.
Theorem Forall2_refl' : forall A B (R:A->B->Prop), Forall2 R [] [].
Proof. Fail (exact Forall2_nil). constructor. Qed.
Coq.Init.Logic
)。这适用于非 MII 参数:
Declare Left Step eq_stepl.
Arguments eq_stepl {A} _ _ _ _ _.
Fail Declare Left Step eq_stepl.
Declare Left Step @eq_stepl.
<tactic-name> ... with (_ := _).
形式的策略在存在 MII 参数的情况下将失败。这是来自
Coq.Init.Logic
的另一个(工作)示例:
Definition eq_ind_r :
forall (A:Type) (x:A) (P:A -> Prop), P x -> forall y:A, y = x -> P y.
intros A x P H y H0; elim eq_sym with (1 := H0); assumption.
Defined.
Arguments eq_sym {A x y} _.
Definition eq_ind_r' :
forall (A:Type) (x:A) (P:A -> Prop), P x -> forall y:A, y = x -> P y.
intros A x P H y H0.
Fail elim eq_sym with (1 := H0); assumption.
(* this works *)
elim @eq_sym with (1 := H0); assumption.
(* or this: *)
elim (eq_sym H0); assumption.
Defined.
Is one more recent than the other ?
Maximal implicit arguments simply need
{}
to be created, whereas one has to useArguments
orImplicit Arguments
to specify non-maximal ones. Does it mean that maximal implicit arguments should be preferred ?
Set Implicit Arguments.
声明非最大插入隐式参数。所以 Coq 对于隐含的程度是保守的(但不是太多)。默认情况下,我会坚持使用非 MII 参数,插入
{}
在适当情况下。
关于coq - 最大与非最大隐式参数的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37211899/
我是一名优秀的程序员,十分优秀!