考虑以下固定点:
Require Import Coq.Lists.List.
Import ListNotations.
Inductive my_type: Type:=
| Left: my_type
| Right: my_type
.
Fixpoint decrease (which: my_type) (left right: list my_type) : list my_type :=
match which with
| Left =>
match left with
| [] => []
| a::tl => decrease a tl right
end
| Right =>
match right with
| [] => []
| a::tl => decrease a left tl
end
end.
Coq 拒绝以下固定点,因为它无法猜测递减的固定点(有时left
列表会失去理智,有时它就是那个right
)。
这个答案表明可以通过使用 aProgram Fixpoint
并指定 a来解决这个问题{measure ((length left)+(length right))}
。
我的问题是:
- 普通
Fixpoint
和 a 和有什么不一样Program Fixpoint
? - 是否可以在常规中显式减少参数
Fixpoint
? - 目标是什么
Next Obligation
?