Возможна ли отладка printf в Ltac? - PullRequest
0 голосов
/ 25 октября 2018

Есть ли способ напечатать значение переменной (будь то гипотеза, тактика, термин) в середине процедуры Ltac?

1 Ответ

0 голосов
/ 26 октября 2018

Да, используйте тактику idtac.

Вы можете передать idtac константную строку для печати.Он также может печатать идентификаторы (например, имена гипотез), если вы сопоставляете их с шаблоном, и может печатать их типы, если вы получаете доступ к ним с сопоставлением с шаблоном или type of.Вы также можете распечатать термины или содержимое переменных Ltac let-bound.Наконец, вы можете передать idtac несколько аргументов, чтобы распечатать их все.Вы упомянули тактику печати - к сожалению, вы не можете печатать с idtac.Если вы попытаетесь, вы просто получите.

Вот несколько примеров:

Goal True -> False. intro Htrue. idtac "hello world". (* prints hello world *) match goal with | [ H: True |- _ ] => idtac H (* prints Htrue *) end. match goal with | |- ?g => idtac g (* prints False *) end. let t := type of Htrue in idtac t. (* prints True *) let x := constr:(1 + 1) in idtac x. (* prints (1 + 1) *) idtac "hello" "there". (* prints hello there *) (* note that this is an Ltac-level function, not a Gallina function *) let x := (fun _ => fail) in idtac x. (* prints <tactic closure> *) Abort.

...