Определенно. unfold def
встраивает определение def
, а также выполняет некоторые базовые c сокращения, например, если def
был применен к чему-либо до того, как он был встроен.
Definition hold {T} (x : T) : Prop := True.
Goal (not False -> hold not).
unfold not.
(* inline not: (fun A : Prop => A -> False) False -> hold (fun A : Prop => A -> False)
and reduce: (False -> False) -> hold (fun A : Prop => A -> False) *)
Однако , fold def
не отменяет сокращение приложений def
. Если вы сейчас выполните
fold not.
, он не свернет False -> False
обратно к not False
. Он найдет только not
под hold
, поэтому вы получите (False -> False) -> hold not
в качестве своей цели. (fold (not False)
уменьшит not False
до False -> False
, ищите это, а затем в конечном итоге дайте цель not False -> hold (fun A : Prop => A -> False
, но, опять же, это не отменило должным образом unfold
). Итак, в основном, последовательность unfold def. fold def.
встраивается и упрощает использование def
там, где она «использовалась» (например, применялась), и пытается оставить нетронутыми другие использования.
Другой пример, на этот раз с йота-уменьшение (уменьшение разрушения) вместо бета-уменьшения.
Definition def : bool := true.
Definition truth (b : bool) : Prop := if b then True else False.
Goal ((if def then True else False) -> truth def).
unfold def.
(* inline def: (if true then True else False) -> truth true
and reduce: True -> truth true *)
fold def.
(* goal: True -> truth def *)
В первом случае cbn.
и unfold not. fold not. cbn.
различны (и ни в одном случае cbn
ничего не делает). В последнем случае cbn.
просто приведет нас прямо к True -> True
, где бы мы его ни поместили.