Я доказать по индукции, чтоHaskell - Использование индукции доказать импликацию
no f xs ==> null (filter f xs)
Где:
filter p [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
null [] = True; null _ = False
no p [] = True
no p (x:xs)
| p x = False
| otherwise = no p xs
Logic implication:
True ==> False = False
_ ==> _ = True
Итак, я предположил, что является следующими условиями моего предположения и мое требование :
Assumption: no f xs ==> null (filter f xs)
Claim: no f (x:xs) ==> null (filter f (x:xs))
И я начал пытаться доказать, базовый вариант (пустой список):
Но я не уверен, что это правильно, потому что я доказал, что они оба являются Истинными, а не то, что если левая часть является Истиной, а вторая - False, то импликация False (то есть определение ==>). Это правильно? Как я могу продолжить доказательство? Я не понимаю, как я могу использовать индукцию для доказательства импликации ...
Спасибо заранее!
То, что вы сделали на базовом корпусе, является правильным, так как ваша «импликация» также является функцией Haskell. Итак, когда вы используете пустой список для xs в базовом случае, все в порядке. –
Нет необходимости даже проверять 'no f []'. Мы знаем, просто расширив определения, что 'null (фильтр f []) = null [] = True' является True. Вы можете сразу приступить к доказательству своего индуктивного случая! – hao
«Если вторая часть False». Вы только что доказали, что вторая часть на самом деле правда. Поэтому, если вторая часть False, то что-то вообще имеет значение True. –