저는 프로그래밍 생애에서 비교적 늦게 Curry-Howard Isomorphism을 접하게 되었고 아마도 이것이 제가 완전히 매료 된 데 기여했을 것입니다. 이는 모든 프로그래밍 개념에 대해 형식 논리에 정확한 아날로그가 존재하며 그 반대의 경우도 있음을 의미합니다. 여기 내 머리 꼭대기에서 그러한 비유의 “기본”목록이 있습니다.
program/definition | proof
type/declaration | proposition
inhabited type | theorem/lemma
function | implication
function argument | hypothesis/antecedent
function result | conclusion/consequent
function application | modus ponens
recursion | induction
identity function | tautology
non-terminating function | absurdity/contradiction
tuple | conjunction (and)
disjoint union | disjunction (or) -- corrected by Antal S-Z
parametric polymorphism | universal quantification
그래서, 제 질문에 : 이 동형의 더 흥미롭고 / 모호한 의미는 무엇입니까? 나는 논리학자가 아니기 때문에이 목록으로 표면을 긁어봤을 뿐이라고 확신합니다.
예를 들어, 논리에서 이름을 알지 못하는 몇 가지 프로그래밍 개념이 있습니다.
currying | "((a & b) => c) iff (a => (b => c))"
scope | "known theory + hypotheses"
그리고 여기에 제가 프로그래밍 용어로 고정하지 않은 몇 가지 논리적 개념이 있습니다.
primitive type? | axiom
set of valid programs? | theory
편집하다:
다음은 응답에서 수집 된 더 많은 등가물입니다.
function composition | syllogism -- from Apocalisp
continuation-passing | double negation -- from camccann
답변
가장 흥미롭고 모호한 것을 명시 적으로 요청했기 때문에 :
CH를 많은 흥미로운 논리 및 논리 공식화로 확장하여 매우 다양한 대응을 얻을 수 있습니다. 여기에서는 모호한 것보다 더 흥미로운 몇 가지와 아직 나오지 않은 몇 가지 근본적인 것들에 초점을 맞추려고 노력했습니다.
evaluation | proof normalisation/cut-elimination
variable | assumption
S K combinators | axiomatic formulation of logic
pattern matching | left-sequent rules
subtyping | implicit entailment (not reflected in expressions)
intersection types | implicit conjunction
union types | implicit disjunction
open code | temporal next
closed code | necessity
effects | possibility
reachable state | possible world
monadic metalanguage | lax logic
non-termination | truth in an unobservable possible world
distributed programs | modal logic S5/Hybrid logic
meta variables | modal assumptions
explicit substitutions | contextual modal necessity
pi-calculus | linear logic
편집 : CH의 확장에 대해 더 많이 배우는 데 관심이있는 모든 사람에게 추천 할 참조 :
“모달 논리의 판단적인 재구성” http://www.cs.cmu.edu/~fp/papers/mscs00.pdf- 이것은 첫 번째 원칙에서 시작하고 대부분이 비논 학자 / 언어 이론가가 이용할 수 있습니다. (나는 두 번째 저자이기 때문에 편견이 있습니다.)
답변
당신은 비 종결과 관련하여 약간의 혼란을 겪고 있습니다. 허위는 무인 유형 으로 표현되며 , 처음에 평가할 유형이 없기 때문에 정의에 따라 종결되지 않을 수 없습니다.
비 종결은 모순 ( 일관되지 않은 논리)을 나타냅니다 . 물론 일관성이없는 논리는 허위를 포함한 모든 것을 증명할 수있게합니다 .
불일치를 무시하고 유형 시스템은 일반적으로 직관 논리에 해당하며 필요에 따라 구성 주의자 입니다. 즉, 고전 논리의 특정 부분을 전혀 표현할 수 없다는 의미입니다. 반면에 이것은 유용합니다. 왜냐하면 타입이 유효한 건설적 증명이라면 그 타입의 용어 는 .
구성주의 풍미의 주요 특징은 이중 부정 이 부정 이 아닌 것과 동등하지 않다는 것입니다. 사실, 부정 그래서 대신에 우리가 예를 들어, 거짓을 의미로 나타낼 수있는, 거의 형식 시스템의 기본입니다, not P
이된다 P -> Falsity
. 따라서 이중 부정은 유형이있는 함수가되며 (P -> Falsity) -> Falsity
, 이는 유형 에 해당하지 않는 것이 분명합니다 P
.
그러나 이것에 흥미로운 비틀기가 있습니다! 파라 메트릭 다형성이있는 언어에서 유형 변수는 무인 유형을 포함하여 가능한 모든 유형에 걸쳐 있으므로 ∀a. a
어떤 의미에서는 거의 거짓 과 같은 완전 다형성 유형 입니다. 그렇다면 다형성을 사용하여 이중 거의 부정을 쓰면 어떨까요? 다음과 같은 유형을 얻습니다 ∀a. (P -> a) -> a
.. 유형의 무언가와 동등 P
합니까? 사실 그것은 단지 그것을 identity 함수에 적용하는 것입니다.
그러나 요점이 무엇입니까? 왜 그런 유형을 작성합니까? 그것은합니까 평균 용어를 프로그래밍에서 아무것도? 글쎄, 당신은 이미 P
어딘가에 유형의 무언가 를 가지고 P
있고, 최종 결과 유형에서 모든 것이 다형성 인 인수로 취하는 함수를 제공해야하는 함수로 생각할 수 있습니다 . 어떤 의미에서 이것은 일시 중단 된 계산을 나타내며 나머지가 제공되기를 기다리고 있습니다. 이러한 의미에서 이러한 일시 중단 된 계산은 함께 구성되고, 전달되고, 호출 될 수 있습니다. 이것은 Scheme 또는 Ruby와 같은 일부 언어의 팬에게 친숙하게 들리기 시작합니다. 이는 이중 부정이 연속 전달 스타일에 해당 한다는 것을 의미하기 때문 입니다., 그리고 사실 위에서 제가 준 타입은 정확히 Haskell의 연속 모나드입니다.
답변
귀하의 차트가 옳지 않습니다. 많은 경우 유형과 용어를 혼동했습니다.
function type implication
function proof of implication
function argument proof of hypothesis
function result proof of conclusion
function application RULE modus ponens
recursion n/a [1]
structural induction fold (foldr for lists)
mathematical induction fold for naturals (data N = Z | S N)
identity function proof of A -> A, for all A
non-terminating function n/a [2]
tuple normal proof of conjunction
sum disjunction
n/a [3] first-order universal quantification
parametric polymorphism second-order universal quantification
currying (A,B) -> C -||- A -> (B -> C), for all A,B,C
primitive type axiom
types of typeable terms theory
function composition syllogism
substitution cut rule
value normal proof
[1] Turing-complete 함수 언어의 논리는 일치하지 않습니다. 재귀는 일관된 이론에서 일치하지 않습니다. 일관되지 않은 논리 / 불건전 한 증명 이론에서는 불일치 / 불건전 성을 유발하는 규칙이라고 부를 수 있습니다.
[2] 다시 말하지만 이것은 완전성의 결과입니다. 논리가 일관 적이라면 이것은 반 정리의 증거가 될 것입니다. 따라서 존재할 수 없습니다.
함수형 언어에는 존재하지 않습니다. 1 차 논리적 특징을 제거하기 때문입니다. 모든 정량화와 매개 변수화는 공식을 통해 이루어집니다. 먼저 차 기능을 가지고 있다면,보다 종류의 다른이있을 것 *
, * -> *
등; 담화 영역의 요소의 종류. 예를 들어 in Father(X,Y) :- Parent(X,Y), Male(X)
, X
and Y
range over the domain of discourse (call it Dom
), and Male :: Dom -> *
.
답변
function composition | syllogism
답변
이 질문이 정말 마음에 듭니다. 나는 많이 알지 못하지만 몇 가지가 있습니다 ( 위키 백과 기사의 도움을 받아 깔끔한 테이블과 그 자체가 있습니다).
-
나는 합계 유형 / 조합 유형 ( 예 🙂
data Either a b = Left a | Right b
이 포괄적 분리 와 동일 하다고 생각합니다 . 그리고 나는 Curry-Howard에 대해 잘 알지는 못하지만 이것이 그것을 증명한다고 생각합니다. 다음 기능을 고려하십시오.andImpliesOr :: (a,b) -> Either a b andImpliesOr (a,_) = Left a
내가 일을 올바르게 이해하면 유형은 ( a ∧ b ) → ( a ★ b )라고 말하고 정의는 이것이 사실이라고 말합니다. 여기서 ★는 포괄적이거나 배타적이거나 둘 중 하나를
Either
나타냅니다. 귀하는Either
배타적 또는 ⊕; 그러나 ( a ∧ b ) ↛ ( a ⊕ b ). 예를 들어, ⊤ ∧ ⊤ ≡ ⊤, 그러나 ⊤ ⊕ ⊥ ≡ ⊥ 및 ⊤ ↛ ⊥. 즉, a 와 b 가 모두 참이면 가설은 참이지만 결론은 거짓이므로이 의미는 거짓이어야합니다. 그러나 분명히 ( a ∧ b ) → ( a ∨ b ), a 와 b 가 모두 참이면 적어도 하나는 참이기 때문입니다. 따라서 차별적 노조가 어떤 형태의 분리라면 포괄적 인 다양성이어야합니다. 나는 이것이 증거라고 생각하지만,이 개념에 대해 저를 반박 할 수 있습니다. -
마찬가지로, 정체성 함수와 비 종결 함수로서의 팽팽함과 부조리에 대한 정의는 약간 틀립니다. 진정한 공식은 단 하나의 요소 ( ; 종종 철자 및 / 또는 함수형 프로그래밍 언어로) 만있는 유형 인 단위 유형으로 표시됩니다 . 이것은 의미가 있습니다. 그 유형은 거주 가 보장 되고 가능한 거주자가 한 명뿐이므로 사실이어야합니다. identity 함수는 a → a .
data ⊤ = ⊤
()
Unit
종료되지 않는 기능에 대한 귀하의 의견은 정확히 무엇을 의미하는지에 따라 더 꺼집니다. Curry-Howard는 유형 시스템에서 작동하지만 비 종결은 인코딩되지 않습니다. 에 따르면 위키 백과 , 비 종단 처리하는 것은 일관성이 논리를 만들어 추가하는 등의 문제 ( 예를 들면 , 내가 정의 할 수 있습니다
wrong :: a -> b
에 의해wrong x = wrong x
“증명”따라서, 그 → B 어떤을위한 및 B ). 이것이“부조리”가 의미하는 바라면 정확히 맞습니다. 대신 당신이 허위 진술을 의미하는 경우에, 당신이 대신 원하는 것은 어떤 사람이 살지 않는 유형이다 예를 들면 에 의해 정의 된 무언가를data ⊥
즉, 구성 할 방법이없는 데이터 유형입니다. 이렇게하면 값이 전혀 없으므로 사람이 살지 않아야하며 이는 false와 동일합니다. 나는 당신이 아마도 사용할 수 있다고 생각a -> b
우리가 종료되지 않는 기능을,이 또한 무인되어 금지하면 때문에,하지만 확실히 100 % 아니에요. -
Wikipedia 는 Curry-Howard를 해석하는 방법에 따라 공리가 결합 자 또는 변수에서 두 가지 다른 방식으로 인코딩된다고 말합니다. 콤비 네이터 뷰는 우리에게 주어진 기본 함수가 기본적으로 말할 수있는 것을 인코딩한다는 것을 의미한다고 생각합니다 (함수 응용 프로그램이 원시이기 때문에 modus ponens가 공리 인 방식과 유사 함). 그리고 저는 변수 뷰가 실제로 같은 것을 의미 할 수 있다고 생각 합니다. 결합자는 결국 특정 함수 인 전역 변수 일뿐입니다. 프리미티브 타입에 관해서 : 내가 이것을 올바르게 생각한다면, 프리미티브 타입은 우리가 증명하려고하는 원시 객체 인 엔티티라고 생각합니다.
-
내 논리와 의미론에 따르면, ( a ∧ b ) → c ≡ a → ( b → c ) (또한 b → ( a → c ))라는 사실은 적어도 자연 추론에서 수출 동등성 법칙이라고합니다. 증거. 나는 그것이 단지 카레라는 것을 그 당시에는 몰랐습니다. 멋있기 때문에 나는 그것을 가지고 싶었습니다!
-
이제 우리는 포괄적 인 분리를 표현할 방법이 있지만 배타적 인 다양성을 표현할 방법은 없습니다. 우리는 그것을 표현하기 위해 배타적 분리의 정의를 사용할 수 있어야합니다. a ⊕ b ≡ ( a ∨ b ) ∧ ¬ ( a ∧ b ). 나는 부정을 쓰는 방법을 모르지만 ¬ p ≡ p → ⊥, 함축과 거짓이 모두 쉽다 는 것을 알고 있습니다. 따라서 우리는 다음과 같은 방법으로 배타적 분리를 나타낼 수 있어야합니다.
data ⊥ data Xor a b = Xor (Either a b) ((a,b) -> ⊥)
이것은
⊥
허위에 해당하는 값이없는 빈 유형으로 정의 됩니다.Xor
다음 포함하도록 정의 모두 ( 및 ) 또는 B ( 또는 )과 함수 ( 의미 에서) (a, b) ( 및 하부 형 (행) 거짓 ).그러나 이것이 무엇을의미하는지 전혀 모릅니다.( 편집 1 : 이제 다음 단락을 참조하십시오!)유형 값이 없기 때문에프로그램에서 이것이 무엇을 의미하는지 이해할 수 없습니다.이 정의 또는 다른 정의에 대해 생각하는 더 좋은 방법을 아는 사람이 있습니까?Either
( 편집 1 : 예, camccann .)(a,b) -> ⊥
편집 1 : 덕분에 camccann의 대답은 (특히, 그가 왼쪽 코멘트가 나를 도와), 나는 여기에 무슨 일이 일어나고 있는지 볼 생각합니다. 유형 값을 생성하려면
Xor a b
두 가지를 제공해야합니다. 첫째,a
또는b
첫 번째 인수로서의 요소의 존재에 대한 증인 ; 즉,Left a
또는Right b
. 둘째, 유형 모두의 요소가 아니라는 것을 증명a
하고b
-에서 다른 단어, 증명(a,b)
무인-로 된 두 번째 인수. 사람이없는(a,b) -> ⊥
경우에만 함수를 작성할 수 있기 때문에(a,b)
그게 무슨 의미일까요? 이는 유형의 객체의 일부가(a,b)
건설 할 수 없습니다. 즉, 가능성이 적어도 하나, 모두, 그a
와b
뿐만 아니라 무인된다! 이 경우, 패턴 매칭에 대해 생각하고 있다면 그러한 튜플에 대해 패턴 매칭을 할 수 없었습니다.b
사람이 살지 않는다고 가정하면 그 튜플의 두 번째 부분과 일치 할 수있는 것은 무엇입니까? 따라서 우리는 패턴 매칭을 할 수 없으므로 이것이 왜 무인도를 만드는지 이해하는 데 도움이 될 수 있습니다. 이제 인수를받지 않는 전체 함수를 갖는 유일한 방법(a,b)
은 (무인 이기 때문에 필수이므로 ) 결과도 무인 유형이되는 것입니다. 패턴 일치 관점에서 이것을 생각한다면, 이는 함수에 케이스가 없더라도 가능한 본문 이 없음을 의미합니다. 둘 중 하나를 가질 수 있으므로 모든 것이 정상입니다.
이 중 많은 부분이 내가 소리내어 생각하고 / 즉석에서 (희망적으로) 무언가를 증명하지만 유용하기를 바랍니다. 나는 정말로 Wikipedia 기사를 추천 한다 ; 나는 어떤 종류의 세부 사항도 읽지 않았지만 표는 정말 멋진 요약이며 매우 철저합니다.
답변
제가 놀랍게도 이전에 언급하지 않은 약간 모호한 것이 있습니다. “고전적인”기능적 반응 프로그래밍은 시간 논리에 해당합니다.
물론, 당신이 철학자, 수학자 또는 강박적인 기능 프로그래머가 아니라면 아마도 몇 가지 더 많은 질문을 제기 할 것입니다.
자, 먼저 함수형 반응 프로그래밍이란 무엇입니까? 시간에 따라 변하는 값 으로 작업하는 선언적 방법 입니다. 이것은 사용자의 입력이 시간에 따라 변하는 값이기 때문에 사용자 인터페이스와 같은 것을 작성하는 데 유용합니다. “클래식”FRP에는 이벤트와 동작의 두 가지 기본 데이터 유형이 있습니다.
이벤트는 이산 시간에만 존재하는 값을 나타냅니다. 키 입력이 좋은 예입니다. 키보드의 입력을 주어진 시간에 문자로 생각할 수 있습니다. 그러면 각 키 누름은 키의 문자 및 누른 시간과 쌍을 이룹니다.
행동은 지속적으로 존재하지만 지속적으로 변할 수있는 가치입니다. 마우스 위치는 좋은 예입니다. x, y 좌표의 동작 일뿐입니다. 결국, 마우스는 항상 위치를 가지며 개념적으로이 위치 는 마우스를 움직일 때 계속 변경 됩니다. 결국 마우스를 움직이는 것은 일련의 개별 단계가 아니라 하나의 장기적인 동작입니다.
그리고 시간 논리는 무엇입니까? 적절하게도 시간이 지남에 따라 정량화 된 제안을 처리하기위한 일련의 논리적 규칙입니다. 기본적으로 □ 및 ◇의 두 가지 한정자로 일반 1 차 논리를 확장합니다. 첫 번째는 “항상”을 의미합니다. □ φ를 “φ 항상 유지”로 읽습니다. 두 번째는 “결국”입니다. ◇ φ는 “φ가 결국 유지 될 것”을 의미합니다. 이것은 특정한 종류의 모달 논리 입니다. 다음 두 가지 법칙은 수량자를 관련시킵니다.
□φ ⇔ ¬◇¬φ
◇φ ⇔ ¬□¬φ
따라서 □와 ◇는 ∀과 ∃와 같은 방식으로 서로 이중입니다.
이 두 수량자는 FRP의 두 가지 유형에 해당합니다. 특히 □는 행동에 해당하고 ◇는 이벤트에 해당합니다. 이러한 유형이 어떻게 거주하는지 생각해 보면, 이것은 의미가있을 것입니다. 행동은 가능한 모든 시간에 거주 하는 반면 사건은 한 번만 발생합니다.
답변
연속과 이중 부정의 관계와 관련하여 call / cc의 유형은 Peirce의 법칙입니다 http://en.wikipedia.org/wiki/Call-with-current-continuation
CH는 일반적으로 직관 논리와 프로그램 간의 대응으로 표시됩니다. 그러나 call-with-current-continuation (callCC) 연산자 (이 유형은 Peirce의 법칙에 해당)를 추가하면 고전 논리 와 callCC를 사용하는 프로그램 간의 대응 관계 를 얻습니다.