2013-12-10 2 views
1

Coq에서 약하게 지정된 유형의 함수를 정의하려고합니다. 특히, 재귀 적 생성자 집합에 의해 유도 적으로 정의되는 유형이 있고, 인수의 일부만 사용하여 생성 된 경우에만 정의되는 함수를 정의하려고합니다.Coq의 증명 인수

Inductive Example : Set := 
    | Example_cons0 : nat -> Example 
    | Example_cons1 : Example -> Example 
    . 

지금, 난 단지 땅 케이스에 적용되는 기능을 가지고 :

더 구체적를하기 위해, 나는 다음과 같은 유형의 정의를 가지고있다. (다음 정의는 분명히 작동하지 않습니다,하지만 내 의도를 제안하기위한 것입니다.)

Definition example (x:Example) : nat := 
    match x with 
    | Example_cons0 n => n 
    end. 

를 이상적으로, 나는 일반적인 유형 생성자의 일부를 사용하여 내 인수, X는, 구축 된 것을 전달하고 싶습니다 ,이 경우 Example_cons0. 나는이 사실을 언급하고 술어의 증거를 논증으로 전달하는 술어를 정의함으로써 이것을 할 수 있다고 생각했다. 예를 들어 :

Definition example_pred (x:Example) : Prop := 
    match x with 
    | Example_cons0 _ => True 
    | _ => False 
    end. 

그리고 뭔가 같은

Definition example2 (x:Example) : example_pred x -> nat := 
    (use proof to define example2?) 

불행하게도, 나는이 중 하나를 수행 가겠어요 방법을 잘 모르겠어요 (로빈 그린에 의해 주어진 권고에 따라). 필자는 약한 유형의 제한된 함수를 정의하는 올바른 방법이라고 확신하지 못합니다.

모든 안내, 제안 또는 제안 사항을 강력하게 환영합니다. - 리

업데이트 : 세부 사항에 대한 자신의 의견을 참조

Definition example (x:Example) : example_pred x -> nat := 
    match x with 
    | Example_cons0 n => fun _ => n 
    | _    => fun proof => match proof with end 
    end. 

:

jozefg에 의한 권고에 따라이 예제 함수는 다음과 같이 정의 할 수 있습니다. 이 함수는 다음 구문을 사용하여 평가할 수 있습니다. 증명 용어가 Coq에 표시되는 방법을 보여줍니다.

Coq < Eval compute in Example.example (Example.Example_cons0 0) (I : Example.example_pred (Example.Example_cons0 0)). 
    = 0 
    : nat 

답변

1

내가

우리가 도움이 기능을

Definition bar f := 
    match f with 
    | Bar _ => True 
    | Baz => False 
    end. 

그리고 정의

Inductive Foo := 
| Bar : nat -> Foo 
| Baz. 

이제 간단한 데이터 유형을 고려 간단한 예로서 이것을 써서 방법은 마지막으로 당신이 원하는 것을 쓰기 :

Definition example f := 
    match f return bar f -> nat with 
    | Bar n => fun _ => n 
    | Baz => fun p => match p with end 
    end. 

이 유형은 forall f : Foo, bar f -> nat입니다. 이것은 exampleBar이 제공되지 않은 경우 사용자가 false (불가능)의 증명을 제공해야한다는 것을 확인함으로써 작동합니다. 그렇지 않으면 어떻게 COQ 알고 가정된다,

example (Bar n) I 

처럼 호출 할 수 있습니다 그러나 문제는 수동으로 일부 용어는 Bar로 구성되어 증명해야 할 수도있다?

+0

영리한 코드는 확실히 작동하지만 정의가 작동하는 방식에 대해 좀 더 설명 할 수 있습니까? 이 문제는 필연적으로 Curry-Howard 동형이 포함되어있는 것처럼 보입니다. 한편으로는 계산 기능을 정의하려고 시도하고있는 반면, 정의에는 증명 주장이 포함되어 있기 때문입니다. 그것은 당신의 해결책과 Green 's가 서로 다른 두 방향에서이 문제에 접근하는 것 같습니다. Green은 증명 항을 계산을 정의하는 데 사용하고, 증명 항은 계산으로 설명합니다. –

+0

특히, 두 번째 일치하는 구문을 사용하면 False로 증명 용어를 줄일 수있는 것처럼 느껴집니다. 미묘하고 간접적입니다. 이 문제를 해결할 수있는보다 직관적 인 방법이 있습니까? –

+0

@LarryLee 그래, 본질적으로 이것은 종속 형을 많이 사용하고 있습니다. 두 번째 인수의 형식은 첫 번째 인수에 따라 다릅니다. 첫 번째 인수가 'Bar'이면 두 번째 인수는 참인 경우에 대한 단순한 증인입니다. 그것이 Baz라면, 우리가 무엇이든 증명할 수있는'False'에 대한 증인입니다. – jozefg

1

예, 올바른 행에 있습니다. 원한다면 :

Definition example2 (x:Example) (example_pred x) : nat := 

어떻게 진행할 것인가는 당신이 증명하고 싶은 것에 달려 있습니다.

당신은 카레 - 하워드 대응하여, 전술을 증명하여 정의를 확인하는 것이 도움이 될 : 나는 sigsigT 유형이 자주 사용되는 것을 지적하고 싶습니다, 또한

Definition example2 (x:Example) (example_pred x) : nat. 
Proof. 
    some proof 
Defined. 

을 "weakly-specified types"와 술어를 결합하여 제약합니다.여기

+0

매우 즉각적인 응답을 보내 주셔서 감사 드리며, 나는 올바른 방향으로 나아가고 있다는 소식을 듣고 기쁘게 생각합니다. 불행히도, 두 번째 코드 스 니펫에 주어진 예제를 사용하려고하면 다음과 같은 구문 오류가 발생합니다 :'> 정의 example2 (x : 예제) (example_pred x) : nat. >^ 구문 오류 : [Prim.name] 또는 ':'예상 됨 [constr : closed_binder]) –

+0

"example_pred x"에 대한 증명을 인수로 전달하는 데 사용할 수있는 다른 구문이 있습니까? –

+0

좋아, 나는 그걸 알아 냈다고 생각해. 올바른 구문은 "정의 example2 (x : 예) : example_pred x -> nat"입니다. 이것을 coqtop에 입력하면 대화 형 증명 환경에 제대로 빠져 있습니다. –