2012-11-24 61 views
1

我想爲二進制自然數(位列表)定義前驅函數。我想限制我的函數輸入到被修剪的數字(沒有前導零)並且是正數(所以,我不必擔心零的前任)。重寫相關函數

這是運營商pred的定義:

Program Fixpoint pred (nat1: Nat) (H1: is_trim nat1 = True) (H2: is_pos nat1 H1 = True): Nat := 
    match nat1 with 
    | Empt => _ 
    | Fill Zer nat2 => Fill One (pred nat2 H1 H2) 
    | Fill One nat2 => Fill Zer nat2 
    end. 

我的首要義務是如下:

nat1: Nat 
H1: is_trim nat1 = True 
H2: is_pos nat1 H1 = True 
H3: Empt = nat1 
______________________________________(1/1) 
Nat 

但是,我不知道如何解決它。

矛盾很明顯在H2。但是,因爲它取決於H1,所以我不能只用rewrite nat1Empt,然後用(is_pos Empt H1)False

我該如何證明這一點?

+0

另外,'dependent-types'應該是一個標籤。 – user1494846

+0

'dependent-type'(單數)是一個標籤。 – sepp2k

+0

我剛剛注意到這個目標是「微不足道的」。 (-_-')不過,我想知道如何通過手工解決它,以防我陷入類似但更復雜的情況。 – user1494846

回答

2

這個目標確實微不足道,因爲您可以返回任何Empt自然數的自然數,並且放心,沒有人可以達到該數,因爲他們首先必須通過適當的H2 : is_pos nat1 H1

我相信下一個「正確」的方式來解決這樣的事情是使用依賴模式匹配,在該行:

Program Fixpoint pred (nat1: Nat) (H1: is_trim nat1 = True) (H2: is_pos nat1 H1 = True): Nat := 
    match nat1 as nat1' return is_pos nat1' H1 -> Nat with 
    | Empt => fun isposEmpt => 
     (* hopefully, is_pos Empt H1 immediately reduces to False, and you can do this: *) 
     False_rec Nat isposEmpt 
    | Fill Zer nat2 => fun _ => Fill One (pred nat2 H1 H2) 
    | Fill One nat2 => fun _ => Fill Zer nat2 
    end H2. 

也就是說,你需要證明NAT1是積極的你的匹配的論點,並且你在Empt案件中得出的結論是證明是假的,所以你也可以返回假。

希望這有效,並有一定的道理。請在下次提供必要的定義以幫助人們玩你的榜樣。