2017-10-20 15 views
2

두 가지 자연스러운 주장을 취하고 어쩌면 평등성을 증명하는 함수를 작성하고 싶습니다.이드리스 (Idris) - 두 숫자의 동등성 확인

나는

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

의이 NatEq 인터페이스의 구현을 살펴 보자 :

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'은 패턴 매치 (pattern match)와 유도 (induction)로 진행할 수 있기 때문에 쉽습니다 (아마도 예제를 위해 다른 유형을 선택했을 것입니다 ...). '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 

Anton는 지적한 바와 같이 부울 테스트 결과에 대한 증인 일 뿐이며 적절한 평등보다 약한 주장입니다. if a==b then ...에 대한 증빙 자료를 제출하는 것이 유용 할 수 있지만 b 대신 a을 사용할 수 없습니다.

+0

@marcosh 'equal : Eq ty => (a, b : ty) -> 어쩌면 ((a == b) = True)'에서 작동하기 때문에 이것이 대답이어야한다고 생각합니다. –