아래에 주어진 재귀 함수가 종료된다는 것을 Coq에게 어떻게 확신시킬 수 있습니까? 이 함수는 두 개의 유도 인수를 취합니다. 직관적으로, 두 인수 중 하나가 분해되어 재귀가 종료됩니다.
특히이 함수는 두 개의 트리를 입력으로 사용합니다.
Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.
나무에서 나는 다음과 같은 스타일의 유도를 좋아합니다.
Inductive TreePair :=
| TipTip : TreePair
| TipBin : Tree -> Tree -> TreePair
| BinTip : Tree -> Tree -> TreePair
| BinBin : TreePair -> TreePair -> TreePair.
Fixpoint pair (l r: Tree): TreePair :=
match l with
| Tip =>
match r with
| Tip => TipTip
| Bin rl rr => TipBin rl rr
end
| Bin ll lr =>
match r with
| Tip => BinTip ll lr
| Bin rl rr => BinBin (pair l rl) (pair lr r)
end
end.
TreePair의 정의는 허용되지만 함수 쌍의 정의는 오류 메시지를 생성합니다.
Error: Cannot guess decreasing argument of fix.
그래서 나는 Coq에게 종결을 확신시키는 방법에 관심이 있습니다.
1
카레를 사용하지 않고 l과 r을 제품으로 함께 전달해 보셨습니까? 도움이 될 것입니다.
—
당 Vognsen
이 질문은 실제로 작업
—
Dave Clarke
pair
이 잘 정의 되도록 데이터 구조에 단조 감소 범위를 지정하는 것에 관한 것입니다 . Coq는 단순히 차량입니다.