2014-02-28 4 views
11

이 질문은 #haskell에 대한 토론에서 나왔습니다.긍정적 인 양의 양화 기호를 외부로 들어 올리는 것은 유효한가요?

깊이 중첩 된 포알을 맨 위로 올리는 것이 항상 올바른지?

예 :

((forall a. P(a)) -> S) -> T 

우리가 일반적으로 그냥 (P(a) -> S) -> T

내가 아는 작성합니다

forall a. (P(a) -> S) -> T 

(에 (P, S, T는 metavariables로 이해 될 수있는 곳) 마지막으로 ->의 오른쪽과 같은 몇 가지 긍정적 인 위치에서 볼거리를 수집 할 수 있습니다.

이것은 고전 논리에서 유효하므로 불합리한 생각은 아니지만 일반적으로 직관 론에서는 유효하지 않습니다. 그러나 각 형식 변수가 "호출자가 선택"하거나 "호출 수신자가 선택한"한정 기호에 대한 나의 비공식적 인 게임 이론 직관은 실제로 두 가지 선택 만 가능하며 "호출자가 선택한"옵션을 모두 끌어 올 수 있음을 나타냅니다. 상단. 게임에서 움직임의 인터리브가 중요하지 않으면?

+0

게임 이론에는 차이가 있습니다. 해제 된 수량 기호를 사용하면 선택할 수 있습니다. 중첩 된 한정 기호를 사용하면 내부 한정 기호를 선택할 때 더 많은 정보를 얻을 수 있습니다. – augustss

+0

맞아요, 그렇다고해서 그걸 위로 올려주지는 않습니다. 일반적으로 맨 위에 양수 기호가 번갈아 표시되는 것을 의미하지 않습니까? ∀a, b ∃c, d ∀e, f 등 – drquicksilver

답변

3

foo :: ((forall a. P a) -> S) -> T 

을 가정하고이 논의 S = (P Int, P Char)을 위해 수 있습니다. 가능한 타입 올바른 호출은 다음과 같을 수 S은 위와입니다
foo (\x :: (forall a. P a) -> (x,x)) 

지금,

bar :: forall a. (P a -> S) -> T 

을 가정합니다. 이제는 bar을 호출하기가 어렵습니다! 의는 a = Int에 전화를 해 봅시다 :

bar (\x :: P Int -> (x, something)) 

이제 우리는 단순히 x에서 파생 할 수없는 something :: P Char이 필요합니다. a = Char 인 경우에도 마찬가지입니다. aInt, Char이 아닌 경우 더 악화됩니다.

당신은 직관 론을 언급했습니다. 이 로직에서 foo의 유형이 bar보다 강하다고 볼 수 있습니다. 더 강력한 가설로서, foo 유형은 증명에서 더 많은 경우에 적용될 수 있습니다. 따라서 용어로는 foo이 더 많은 상황에서 적용 가능하다는 것을 발견하는 것은 놀라운 일이 아닙니다. :)

+0

음,'P'는 자유 변수 'a'가있는 실제의 고정 유형 용어입니다. 'P Int'와'P Char'가 둘 다 비공개가 아니라면, 그들 중 주민 (''pi''와''pc'')을 선택하고''const (pi, pc)' '를 전달하여'bar'를 호출하십시오. 'bar'는'foo'처럼 호출 가능합니다. 아무 것도 그 인자를 검사하는'bar' 함수를 전달할 필요가 없습니다. – drquicksilver

+0

주민들이'S'에 대해 알고 있다면, 나는 동의한다.그러나 일반적인 경우에는'forall a. '라는 가설에 의지하지 않고'S'에 살 수는 없습니다. P a'. 또한'P a = Q b a'와'S = (P Int, P Char)'와 같은 경우를 생각해 보자. 여기서'S'는'b'의 값에 대해서만 살 수 있습니다. 그러나'S'에 의존하지 않고'foo'를 호출 할 수 있습니다. – chi