Я определил рекурсивную функцию для всех подмножеств nat_list в Coq, какПодмножества списка нац в Coq
Fixpoint subsets (a: list nat) : (list (list nat)) :=
match a with
|[] => [[]]
|h::t => subsets t ++ map (app [h]) (subsets t)
end.
Я пытаюсь доказать, что
forall (a:list nat), In [] (subsets a).
Я пытался индукцию по а. Базовый корпус был прямым. Однако в индукционном случае я попытался использовать встроенную теорему in_app_or
.
Unable to unify "In ?M1396 ?M1394 \/ In ?M1396 ?M1395" with
"(fix In (a : list nat) (l : list (list nat)) {struct l} : Prop :=
match l with
| [] => False
| b :: m => b = a \/ In a m
end)
[] (subsets t ++ map (fun m : list nat => h :: m) (subsets t))".
Как доказать такую теорему или решить такую проблему?
Примечания о вашем наименовании ваша функция не возвращает «подмножество» в смысле списка списков, не имеющих тех же свойств, что и набор списков. В частности, сделайте списки '[a; b] 'и' [b; a] 'представляют один и тот же набор? Думаю об этом! – ejgallego
Для чего это стоит, в этом случае «индукция l; просто, интуиция» также является веским доказательством. –