首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ltac中的表示法

ltac中的表示法
EN

Stack Overflow用户
提问于 2018-02-03 06:12:04
回答 2查看 964关注 0票数 2

我注意到符号可以被不同的对待。例如,<只是普通定义的表示法,而unfold "<"确实工作,如下例所示:

代码语言:javascript
复制
Theorem a : 4 < 5.
Proof.
    unfold "<".

但是,<=是与类型le相关联的符号,由于某些原因,unfold "<="无法工作,如下面的示例所示:

代码语言:javascript
复制
Theorem a : 4 <= 5
Proof.
   unfold "<=".

这在Unable to interpret "<=" as a reference中失败了。

我可以使用ltac命令将4 <= 5转换为le 4 5吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-07 10:09:10

添加到Anton的回答:如果您已经知道如何定义表示法,并且只想使它在目标中可见,您可以这样做

代码语言:javascript
复制
Definition make_visible {X} (f : X) := f.

Notation "` f" := (make_visible f) (at level 5, format "` f").

Tactic Notation "unfold" "notation" constr(f) :=
  change f with (`f).
Tactic Notation "fold" "notation" constr(f) :=
  unfold make_visible.

Theorem a : 4 <= 5.
Proof.
  unfold notation le.
  fold notation le.

(编辑:我的第一个解决方案是Definition make_visible {X} (f : X) := (fun _ => f) tt.,但是,正如Anton指出的,这更容易。)

票数 1
EN

Stack Overflow用户

发布于 2018-02-03 11:12:53

之所以会发生这种情况,是因为<被解释为lt,这是一个定义(这里):

代码语言:javascript
复制
Definition lt (n m:nat) := S n <= m.

您可以使用unfold lt实现同样的效果。

同样,<=的意思是le,但您不能展开le,因为它是一个类型构造函数。手册说,您只能展开定义的透明常量或本地定义。

这里的结果是,你不展开符号,而是展开那些符号所指的定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48594507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档