2017-10-20 6 views
2

2つの自然な引数をとり、それらの等価性の証明の多分を返す関数を書いてみたいと思います。Idris - 2つの数値の等価性を証明する

私は

equal : (a: Nat) -> (b: Nat) -> Maybe ((a == b) = True) 
equal a b = case (a == b) of 
    True => Just Refl 
    False => Nothing 

にしようとしているが、私はこれを行うには正しい方法で、次のエラー

When checking argument x to constructor Prelude.Maybe.Just: 
     Type mismatch between 
       True = True (Type of Refl) 
     and 
       Prelude.Nat.Nat implementation of Prelude.Interfaces.Eq, method == a 
                        b = 
       True (Expected type) 

     Specifically: 
       Type mismatch between 
         True 
       and 
         Prelude.Nat.Nat implementation of Prelude.Interfaces.Eq, method == a 
                          b 

を取得しますか?

また、ボーナス質問として、私がしなければ

equal : (a: Nat) -> (b: Nat) -> Maybe ((a == b) = True) 
equal a b = case (a == b) of 
    True => proof search 
    False => Nothing 

私は

INTERNAL ERROR: Proof done, nothing to run tactic on: Solve 
pat {a_504} : Prelude.Nat.Nat. pat {b_505} : Prelude.Nat.Nat. Prelude.Maybe.Nothing (= Prelude.Bool.Bool Prelude.Bool.Bool (Prelude.Interfaces.Prelude.Nat.Nat implementation of Prelude.Interfaces.Eq, method == {a_504} {b_505}) Prelude.Bool.True) 
This is probably a bug, or a missing error message. 
Please consider reporting at https://github.com/idris-lang/Idris-dev/issues 

は、それが既知の問題であり得るか、私はそれを報告しなければなりませんか?

+0

問題を報告する決定を下す一方、戦術ベースの証明はIdrisでは廃止されていることに注意してください。 –

+1

'decEq'の使用を検討してください。 – 2426021684

答えて

4

のはNatためEqインタフェースの実装を見てみましょう:

Eq Nat where 
    Z == Z   = True 
    (S l) == (S r) = l == r 
    _ == _   = False 

あなただけの、次のように(==)機能の構造に従うことによって問題を解決することができます

total 
equal : (a: Nat) -> (b: Nat) -> Maybe ((a == b) = True) 
equal Z Z = Just Refl 
equal (S l) (S r) = equal l r 
equal _ _ = Nothing 
+0

答えに感謝します! 'Nat'は、パターンマッチングと誘導による手順が可能なので簡単です(私は、おそらくこの例では別のタイプを選択していたはずです...)。 'Int'や' Eq'を実装する他の型はどうでしょうか? – marcosh

+2

'(==)'はブール値を返しますので、(原則として)常に 'False'を返すことができます。 'a == b 'は'(==) 'の実装を見ずに' a = b'を伴うことをどのようにして知っていますか?証明では、あなたの関数がその意味を伝達するために十分に強力な出力型( 'decEq'のような)を持たなければならないか、関数の本体にアクセスする必要があります。 –

4

あなたはcase(従属パターンマッチング)の代わりにwithを使用するとできます。

equal : (a: Nat) -> (b: Nat) -> Maybe ((a == b) = True) 
equal a b with (a == b) 
    | True = Just Refl 
    | False = Nothing 

アントンが指摘しているように、これは単なるブール値テスト結果の証人であり、適切な平等よりも弱い主張です。それはif a==b then ...についての証拠を前進させるのに役立つかもしれませんが、bの代わりにaを代用することはできません。

+0

@marcosh 'equal:Eq ty =>(a、b:ty) - >多分((a == b)= True)'のためにこれが答えであるべきだと思います。 –

関連する問題