Я определил свои пропозициональные формулы следующим образом:
Inductive propForm : Set :=
| top : propForm
| bot : propForm
| var : propVar -> propForm
| orp : propForm -> propForm -> propForm
| andp : propForm -> propForm -> propForm.
Я пытаюсь определить функцию преобразования пропозициональной формулы в формулу в ДНФ. Для этого я определил функцию, которая распределяет члены по дистрибутивному закону:
Fixpoint distribute (f:propForm) : propForm -> propForm :=
fix distribute1 (g:propForm) : propForm :=
match f with
| f1 \/p f2 => match g with
| g1 \/p g2 => distribute1 g1 \/p distribute1 g2
| _ => distribute f1 g \/p distribute f2 g
end
| _ => match g with
| g1 \/p g2 => distribute1 g1 \/p distribute1 g2
| _ => f /\p g
end
end.
Эта функция работает нормально. Однако мне все еще нужно определить функцию, которая преобразует пропозициональную формулу в ДНФ. Следующая функция будет делать то, что я хочу, однако Coq не принимает ее, потому что функция не убывает структурно по f' для последнего случая. Любые подсказки и советы будут оценены.
Fixpoint toDNF (f':propForm):propForm :=
match f' with
| top => f'
| bot => f'
| var _ => f'
| f1 \/p f2 => toDNF f1 \/p toDNF f2
| f1 /\p f2 => toDNF (distribute f1 f2)
end.