let rec is_irrefutable_pattern (a_pattern: Ast.patt): bool =
match a_pattern with
<:patt< () >> -> true
| <:patt< ( $p$ : $_$ ) >> ->
is_irrefutable_pattern p
| <:patt< ( $p1$ as $_p2$ ) >> ->
is_irrefutable_pattern p1
| <:patt< { $r$ } >> ->
is_irrefutable_pattern r
| <:patt< $_$ = $p$ >> ->
is_irrefutable_pattern p
| <:patt< $r1$; $r2$ >> ->
is_irrefutable_pattern r1 && is_irrefutable_pattern r2
| <:patt< $t1$, $t2$ >> ->
is_irrefutable_pattern t1 && is_irrefutable_pattern t2
| <:patt< ($tup:t$) >> ->
is_irrefutable_pattern t
| <:patt< $lid:_$ >> -> true
| <:patt< _ >> -> true
| _ -> false