2015-12-07 6 views
2

Я доказать по индукции, что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 (то есть определение ==>). Это правильно? Как я могу продолжить доказательство? Я не понимаю, как я могу использовать индукцию для доказательства импликации ...

Спасибо заранее!

+0

То, что вы сделали на базовом корпусе, является правильным, так как ваша «импликация» также является функцией Haskell. Итак, когда вы используете пустой список для xs в базовом случае, все в порядке. –

+0

Нет необходимости даже проверять 'no f []'. Мы знаем, просто расширив определения, что 'null (фильтр f []) = null [] = True' является True. Вы можете сразу приступить к доказательству своего индуктивного случая! – hao

+0

«Если вторая часть False». Вы только что доказали, что вторая часть на самом деле правда. Поэтому, если вторая часть False, то что-то вообще имеет значение True. –

ответ

1

Вот полное доказательство. Позже, когда у меня будет немного больше времени, я докажу это на Agda или Idris и разместим здесь код.

Доказательство по индукции свыше xs.

Дело xs = []:

no f [] ==> null (filter f []) 
== {- Filter.1, filter p [] = [] -} 
no f [] ==> null ([]) 
== {- No.1, no p [] = True-} 
True ==> null ([]) 
== {- Null.1, null [] = True -} 
True ==> True 

Case xs = y : ys. Предположим, что no f ys == null (filter f ys). Рассмотрим следующие случаи:

Дело f y == True:

no f (y : ys) ==> null (filter f (y : ys)) 
== {- no - f y == True -} 
False ==> null (filter f (y : ys)) 
== 
True 

Дело f y == False:

no f (y : ys) ==> null (filter f (y : ys)) 
=={- By definition of filter and no -} 
no f ys ==> null (filter f ys) 
== {By I.H.} 
True 

что завершает доказательство.

+0

Это доказательство просто идеально и понятно! Спасибо! – Fossa