Zulip Chat Archive

Stream: general

Topic: orelse nontermination

Seul Baek (Dec 26 2018 at 05:58):

meta def foo : tactic unit :=
triv <|> foo

example : true := by foo

In this example I expected foo to behave just like triv since the right branch would never be used, but it times out. Is there a way to avoid this?

Mario Carneiro (Dec 26 2018 at 06:58):

you can eta expand foo on the right

Gabriel Ebner (Dec 26 2018 at 08:19):

Another nice option is to use local attribute [inline] interaction_monad_orelse.

Seul Baek (Dec 26 2018 at 12:15):

@Mario Carneiro I thought you meant changing the body of foo to triv <|> (λ s, foo s), but this still times out. Am I doing something wrong here?

Seul Baek (Dec 26 2018 at 12:17):

@Gabriel Ebner That works. Thanks!

Mario Carneiro (Dec 26 2018 at 20:07):

actually I think you have to eta expand the definition of foo itself, i.e. def foo | s := (triv <|> foo) s

Last updated: Aug 03 2023 at 10:10 UTC