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
영리한 코드는 확실히 작동하지만 정의가 작동하는 방식에 대해 좀 더 설명 할 수 있습니까? 이 문제는 필연적으로 Curry-Howard 동형이 포함되어있는 것처럼 보입니다. 한편으로는 계산 기능을 정의하려고 시도하고있는 반면, 정의에는 증명 주장이 포함되어 있기 때문입니다. 그것은 당신의 해결책과 Green 's가 서로 다른 두 방향에서이 문제에 접근하는 것 같습니다. Green은 증명 항을 계산을 정의하는 데 사용하고, 증명 항은 계산으로 설명합니다. –
특히, 두 번째 일치하는 구문을 사용하면 False로 증명 용어를 줄일 수있는 것처럼 느껴집니다. 미묘하고 간접적입니다. 이 문제를 해결할 수있는보다 직관적 인 방법이 있습니까? –
@LarryLee 그래, 본질적으로 이것은 종속 형을 많이 사용하고 있습니다. 두 번째 인수의 형식은 첫 번째 인수에 따라 다릅니다. 첫 번째 인수가 'Bar'이면 두 번째 인수는 참인 경우에 대한 단순한 증인입니다. 그것이 Baz라면, 우리가 무엇이든 증명할 수있는'False'에 대한 증인입니다. – jozefg