有没有办法在命令成功后打印(使用idtac
?)Ltac中的消息?像
first [ a; idtac "a did it!" | b; idtac "b did!" | idtac "nope"; fail ]
除了多个子目标导致打印多条消息外,这几乎可以正常工作:
Goal True /\ True.
split; idtac "Split did it!".
过滤第一个目标似乎有效......
Goal True /\ True.
split; [ idtac "Split did it!" | .. ].
...除非它没有:
Goal True /\ True.
tauto; [ idtac "Tauto did it!" | .. ].
我可能将这两种模式合二为一,但我不太热衷于100%的点球命中率。而这仍然无法解决完全解除目标的策略。
(我最感兴趣的是对8.5之前的Coq的答案,因为在8.5 Info
之类的等等提供了很好的设施。即使在8.5中,只能在以下打印调试消息会很有趣某些要点)
答案 0 :(得分:1)
只需使用idtac
即可在Coq> = 8.5。
除了多个子目标导致打印多条消息外,这几乎可以正常工作:
Goal True /\ True. split; idtac "Split did it!".
事实并非如此;如果是,let n := numgoals in idtac n
也会打印多次。这是我看到的输出:
$ ~/.local64/coq/coq-8.5pl3/bin/coqtop
Welcome to Coq 8.5pl3 (November 2016)
Coq < Goal True /\ True.
1 subgoal
============================
True /\ True
Unnamed_thm < split; idtac "Split did it!".
Split did it!
2 subgoals
============================
True
subgoal 2 is:
True
Unnamed_thm <
在Coq&lt; = 8.4中,你不能这样做,因为Ltac评估有不同的模型。相反,如果您愿意略微复杂化证明术语,并且您可以访问战术序列的开头,那么您可以这样做:
Ltac duplicate_goal :=
lazymatch goal with
| [ |- ?G ] => cut G
end.
Goal True /\ True.
duplicate_goal; [ | split ]; [ idtac "Split did it!"; exact (fun x => x) | .. ].
这个想法是,通过复制目标,你可以先在目标的一个副本中运行你的战术,然后,假设成功,你可以在目标的另一个副本中进行idtac(无论是作为单一目标存在)或者不是你的第一个战术创造了多个子目标或解决了目标或其他什么),最后用身份函数解决了重复的目标。