gpt4 book ai didi

Coq:变量参数列表上的 Ltac 定义?

转载 作者:行者123 更新时间:2023-12-02 15:10:55 25 4
gpt4 key购买 nike

在尝试创建一个循环可变长度参数列表的 Ltac 定义时,我在 Coq 8.4pl2 上遇到了以下意外行为。谁能给我解释一下吗?

Ltac ltac_loop X :=
match X with
| 0 => idtac "done"
| _ => (fun Y => idtac "hello"; ltac_loop Y)
end.

Goal True.
ltac_loop 0. (* prints "done" as expected *)
ltac_loop 1 0. (* prints "hello" then "done" as expected *)
ltac_loop 1 1 0. (* unexpectedly yields "Error: Illegal tactic application." *)

最佳答案

让我们展开最后一次调用 ltac_loop 来看看发生了什么:

ltac_loop 1 1 0
-> (fun Y => idtac "hello"; ltac_loop Y) 1 0
-> (idtac "hello"; ltac_loop 1) 0

在那里你可以看到问题:你试图将不是函数的东西应用于参数,这会导致你看到的错误。解决方案是以连续传递的方式重写策略:

Ltac ltac_loop_aux k X :=
match X with
| 0 => k
| _ => (fun Y => ltac_loop_aux ltac:(idtac "hello"; k) Y)
end.

Ltac ltac_loop X := ltac_loop_aux ltac:(idtac "done") X.

关于Coq:变量参数列表上的 Ltac 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22727363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com