Phần nào của Hindley-Milner mà bạn không hiểu?


851

Tôi thề có một chiếc áo phông được rao bán với những từ bất hủ:


Phần nào của

Hindley-Milner

bạn không hiểu à


Trong trường hợp của tôi, câu trả lời sẽ là ... tất cả!

Đặc biệt, tôi thường thấy ký hiệu như thế này trong các bài báo của Haskell, nhưng tôi không biết ý nghĩa của nó là gì. Tôi không biết nó thuộc nhánh toán học nào.

Tôi nhận ra các chữ cái trong bảng chữ cái Hy Lạp tất nhiên và các ký hiệu như "" (thường có nghĩa là một cái gì đó không phải là một yếu tố của một tập hợp).

Mặt khác, tôi chưa bao giờ thấy "" trước đây ( Wikipedia tuyên bố nó có thể có nghĩa là "phân vùng" ). Tôi cũng không quen với việc sử dụng vinculum ở đây. (Thông thường, nó biểu thị một phần nhỏ, nhưng điều đó không xuất hiện là trường hợp ở đây.)

Nếu ai đó ít nhất có thể cho tôi biết nơi bắt đầu tìm hiểu để hiểu ý nghĩa của biển biểu tượng này, điều đó sẽ hữu ích.


8
Nếu bạn đang tìm kiếm một lời giải thích tốt về thuật toán, điều tốt nhất mà tôi tìm thấy cho đến nay là trong chương 30 của Ngôn ngữ lập trình của Shriram Krishnamurthi's : Ứng dụng và Phiên dịch (CC được cấp phép!).
laslowh

2
@laslowh Cảm ơn bạn! Tôi đang đọc nó Phiên bản mới hơn: cs.brown.edu/cifts/cs173/2012/book/book.pdf
SnowOnion

Câu trả lời:


652
  • Thanh ngang có nghĩa là "[ở trên] ngụ ý [bên dưới]".
  • Nếu có nhiều biểu thức trong [trên], sau đó xem xét chúng anded với nhau; tất cả [trên] phải đúng để đảm bảo [bên dưới].
  • :có nghĩa là có loại
  • có nghĩa là trong . (Tương tự như vậy có nghĩa là "không có trong".)
  • Γthường được sử dụng để chỉ một môi trường hoặc bối cảnh; trong trường hợp này, nó có thể được coi là một tập hợp các chú thích kiểu, ghép nối một định danh với loại của nó. Do đó, x : σ ∈ Γcó nghĩa là môi trường Γbao gồm thực tế xcó loại σ.
  • có thể được đọc như chứng minh hoặc xác định. Γ ⊢ x : σcó nghĩa là môi trường Γxác định rằng xcó loại σ.
  • ,là một cách bao gồm các giả định bổ sung cụ thể vào một môi trường Γ.
    Do đó, Γ, x : τ ⊢ e : τ'có nghĩa là môi trường Γ, với giả định bổ sung, ghi đè xcó loạiτ , chứng minh rằng ecó loại τ'.

Theo yêu cầu: ưu tiên nhà điều hành, từ cao nhất đến thấp nhất:

  • Ghi vào và mixfix khai thác ngôn ngữ cụ thể, chẳng hạn như λ x . e, ∀ α . στ → τ', let x = e0 in e1và khoảng trắng cho các ứng dụng hoạt động.
  • :
  • , (liên kết trái)
  • khoảng trắng phân tách nhiều mệnh đề (kết hợp)
  • thanh ngang

19
Các quy tắc ưu tiên của các nhà khai thác là gì?
Randomblue

:rất giống nhau, ở chỗ chúng có nghĩa là một thứ được chứa trong một thứ khác - một tập hợp chứa các phần tử và một kiểu chứa các giá trị, theo một nghĩa nào đó. Sự khác biệt quan trọng là điều đó x ∈ Scó nghĩa là một tập hợp Scó chứa một phần tử theo nghĩa đen x, trong khi đó Γ ⊢ x : Tcó nghĩa là xcó thể suy ra kiểu cư trú Ttrong ngữ cảnh Γ. Xem xét điều này, quy tắc Var ghi: »Nếu x được chứa trong ngữ cảnh theo nghĩa đen, nó có thể (tầm thường) được suy ra từ nó«.
David

@Randomblue tôi làm rõ những ưu tiên của các biểu tượng bằng cách thêm dấu ngoặc đơn ở khắp mọi nơi, ví dụ (Γ,(x:τ))⊢(x:σ), xem overleaf.com/read/ddmnkzjtnqbd#/61990222
SnowOnion

327

Cú pháp này, mặc dù có thể trông phức tạp, nhưng thực sự khá đơn giản. Ý tưởng cơ bản xuất phát từ logic chính thức: toàn bộ biểu thức là một hàm ý với nửa trên là các giả định và nửa dưới là kết quả. Đó là, nếu bạn biết rằng các biểu thức trên cùng là đúng, bạn có thể kết luận rằng các biểu thức dưới cùng cũng đúng.

Biểu tượng

Một điều khác cần ghi nhớ là một số chữ cái có ý nghĩa truyền thống; đặc biệt, đại diện cho "bối cảnh" mà bạn đang ở trong đó, đó là những loại khác mà bạn đã thấy. Vì vậy, một cái gì đó như Γ ⊢ ...có nghĩa là "biểu thức ...khi bạn biết các loại của mọi biểu thức trong Γ.

Các biểu tượng về cơ bản có nghĩa là bạn có thể chứng minh một cái gì đó. Vì vậy, Γ ⊢ ...một tuyên bố nói rằng "Tôi có thể chứng minh ...trong một bối cảnh Γ. Những tuyên bố này còn được gọi là phán đoán kiểu.

Một điều khác cần ghi nhớ: trong toán học, giống như ML và Scala, x : σcó nghĩa là xcó loại σ. Bạn có thể đọc nó giống như của Haskell x :: σ.

Ý nghĩa của mỗi quy tắc

Vì vậy, khi biết điều này, biểu thức đầu tiên trở nên dễ hiểu: nếu chúng ta biết rằng x : σ ∈ Γ(nghĩa là xcó một số loại σtrong một số ngữ cảnh Γ), thì chúng ta biết rằng Γ ⊢ x : σ(nghĩa là, trong Γ, xcó loại σ). Vì vậy, thực sự, điều này không nói với bạn bất cứ điều gì siêu thú vị; nó chỉ cho bạn biết làm thế nào để sử dụng bối cảnh của bạn.

Các quy tắc khác cũng đơn giản. Ví dụ, lấy [App]. Quy tắc này có hai điều kiện: e₀là một hàm từ một số loại τđến một số loại τ'e₁là một giá trị của loại τ. Bây giờ bạn biết loại bạn sẽ nhận được bằng cách áp dụng e₀cho e₁! Hy vọng rằng đây không phải là một bất ngờ :).

Quy tắc tiếp theo có một số cú pháp mới. Đặc biệt, Γ, x : τchỉ có nghĩa là bối cảnh được tạo thành Γvà sự phán xét x : τ. Vì vậy, nếu chúng ta biết rằng biến xcó một loại τvà biểu thức ecó một loại τ', chúng ta cũng biết loại hàm nhận xvà trả về e. Điều này chỉ cho chúng ta biết phải làm gì nếu chúng ta tìm ra loại chức năng nào và loại nào trả về, vì vậy nó cũng không đáng ngạc nhiên.

Việc tiếp theo chỉ cho bạn biết cách xử lý các letcâu lệnh. Nếu bạn biết rằng một số biểu thức e₁có một loại τmiễn là xcó một loại σ, thì một letbiểu thức liên kết cục bộ với xmột giá trị của loại σsẽ tạo ra e₁một loại τ. Thực sự, điều này chỉ cho bạn biết rằng một câu lệnh let về cơ bản cho phép bạn mở rộng bối cảnh với một ràng buộc mới, đó chính xác là những gì let!

Các [Inst]quy tắc liên quan đến gõ phụ. Nó nói rằng nếu bạn có một giá trị của kiểu σ'và nó là một kiểu con của σ( đại diện cho một quan hệ thứ tự một phần) thì biểu thức đó cũng là kiểu σ.

Các quy tắc cuối cùng liên quan đến các loại khái quát. Bỏ qua một bên: một biến miễn phí là một biến không được giới thiệu bởi let-statement hoặc lambda bên trong một số biểu thức; biểu thức này bây giờ phụ thuộc vào giá trị của biến miễn phí từ ngữ cảnh của nó. Quy tắc nói rằng nếu có một biến αnào đó không "miễn phí" trong bất kỳ điều gì trong ngữ cảnh của bạn, thì có thể nói rằng bất kỳ biểu thức nào có loại bạn biết e : σsẽ có loại đó cho bất kỳ giá trị nàoα .

Cách sử dụng các quy tắc

Vì vậy, bây giờ bạn đã hiểu các biểu tượng, bạn sẽ làm gì với các quy tắc này? Chà, bạn có thể sử dụng các quy tắc này để tìm ra loại giá trị khác nhau. Để làm điều này, hãy nhìn vào biểu thức của bạn (nói f x y) và tìm một quy tắc có kết luận (phần dưới cùng) phù hợp với tuyên bố của bạn. Hãy gọi điều bạn đang cố gắng tìm "mục tiêu" của mình. Trong trường hợp này, bạn sẽ xem xét quy tắc kết thúc bằng e₀ e₁. Khi bạn đã tìm thấy điều này, bây giờ bạn phải tìm các quy tắc chứng minh mọi thứ nằm trên dòng quy tắc này. Những điều này thường tương ứng với các loại biểu thức phụ, vì vậy về cơ bản bạn đang đệ quy trên các phần của biểu thức. Bạn chỉ cần làm điều này cho đến khi bạn hoàn thành cây chứng minh của mình, nó cung cấp cho bạn một bằng chứng về loại biểu thức của bạn.

Vì vậy, tất cả các quy tắc này làm là chỉ định chính xác giáo dục và trong chi tiết toán học thông thường về mặt toán học: Pật làm thế nào để tìm ra các loại biểu thức.

Bây giờ, điều này nghe có vẻ quen thuộc nếu bạn đã từng sử dụng Prolog Ba, về cơ bản bạn đang tính toán cây chứng minh như trình thông dịch Prolog của con người. Có một lý do Prolog được gọi là "lập trình logic"! Điều này cũng quan trọng vì cách đầu tiên tôi được giới thiệu với thuật toán suy luận HM là bằng cách triển khai nó trong Prolog. Điều này thực sự đơn giản đáng ngạc nhiên và làm cho những gì đang diễn ra rõ ràng. Bạn chắc chắn nên thử nó.

Lưu ý: Tôi có thể đã phạm một số sai lầm trong lời giải thích này và sẽ thích nó nếu ai đó chỉ ra chúng. Tôi thực sự sẽ trình bày điều này trong lớp trong một vài tuần, vì vậy tôi sẽ tự tin hơn sau đó: P.


5
\ alpha là biến loại không tự do, không phải là biến thông thường. Vì vậy, để giải thích quy tắc khái quát nhiều hơn nữa phải được giải thích.
nponeccop

2
@nponeccop: Hmm, điểm tốt. Tôi chưa thực sự thấy quy tắc cụ thể đó trước đây. Bạn có thể giúp tôi giải thích nó đúng?
Tikhon Jelvis

8
@TikhonJelvis: Nó thực sự khá đơn giản, nó cho phép bạn để khái quát (giả Γ = {x : τ}) λy.x : σ → τđể ∀ σ. σ → τ, nhưng không đến ∀ τ. σ → τ, bởi vì τcó thể thay đổi tự do trong Γ. Bài viết trên Wikipedia về HM giải thích nó khá độc đáo.
Vitus

7
Tôi tin rằng một phần của câu trả lời liên quan đến [Inst]là một chút không chính xác. Đây chỉ là sự hiểu biết của tôi cho đến nay, nhưng các sigmas trong [Inst][Gen]quy tắc không đề cập đến các loại, mà là các lược đồ kiểu . Vì vậy, toán tử là một thứ tự một phần không liên quan đến gõ phụ như chúng ta biết từ các ngôn ngữ OO. Nó liên quan đến các giá trị đa hình như id = λx. x. Cú pháp đầy đủ cho một chức năng như vậy sẽ là id = ∀x. λx. x. Bây giờ, rõ ràng chúng ta có thể có một id2 = ∀xy. λx. x, nơi ykhông được sử dụng. Sau đó id2 ⊑ id, đó là những gì [Inst]quy tắc nói.
Ionuț G. Stan

71

nếu ai đó ít nhất có thể cho tôi biết nơi bắt đầu tìm hiểu để hiểu ý nghĩa của biển biểu tượng này

Xem " Cơ sở thực tiễn của ngôn ngữ lập trình. ", Chương 2 và 3, về phong cách logic thông qua các phán đoán và dẫn xuất. Toàn bộ cuốn sách hiện có sẵn trên Amazon.

chương 2

Định nghĩa quy nạp

Định nghĩa quy nạp là một công cụ không thể thiếu trong nghiên cứu ngôn ngữ lập trình. Trong chương này, chúng tôi sẽ phát triển khung cơ bản của các định nghĩa quy nạp và đưa ra một số ví dụ về việc sử dụng chúng. Một định nghĩa quy nạp bao gồm một tập hợp các quy tắc để đưa ra các phán đoán , hoặc khẳng định , dưới nhiều hình thức khác nhau. Phán quyết là những tuyên bố về một hoặc nhiều đối tượng cú pháp của một loại xác định. Các quy tắc xác định các điều kiện cần và đủ cho tính hợp lệ của bản án và do đó xác định đầy đủ ý nghĩa của nó.

2.1 Bản án

Chúng ta bắt đầu với khái niệm về một phán đoán , hoặc khẳng định về một đối tượng cú pháp. Chúng ta sẽ sử dụng nhiều hình thức phán xét, bao gồm các ví dụ như:

  • n nat - n là số tự nhiên
  • n = n1 + n2 - n là tổng của n1n2
  • τ loại - τ là một loại
  • e : τ - biểu thức e có kiểu τ
  • ev - biểu thức e có giá trị v

Một bản án tuyên bố rằng một hoặc nhiều đối tượng cú pháp có một thuộc tính hoặc đứng trong mối quan hệ nào đó với nhau. Bản thân tài sản hoặc quan hệ được gọi là hình thức phán quyết và phán quyết rằng một đối tượng hoặc đối tượng có tài sản đó hoặc đứng trong mối quan hệ đó được cho là một ví dụ của hình thức phán quyết đó. Một hình thức phán xét cũng được gọi là một vị ngữ và các đối tượng cấu thành một thể hiện là các chủ thể của nó . Chúng tôi viết một J cho phán đoán khẳng định rằng J giữ a . Khi nó không quan trọng để nhấn mạnh chủ đề của bản án, (văn bản cắt ở đây)


53

Làm thế nào để tôi hiểu các quy tắc Hindley-Milner?

Hindley-Milner là một bộ quy tắc dưới dạng tính toán tuần tự (không phải khấu trừ tự nhiên) chứng tỏ rằng chúng ta có thể suy ra loại (chung nhất) của một chương trình từ việc xây dựng chương trình mà không cần khai báo loại rõ ràng.

Các ký hiệu và ký hiệu

Trước tiên, hãy giải thích các biểu tượng và thảo luận về quyền ưu tiên của nhà điều hành

  • 𝑥 là một định danh (không chính thức, một tên biến).
  • : có nghĩa là một loại (không chính thức, một thể hiện của hoặc "is-a").
  • σ(sigma) là một biểu thức có nghĩa là hoặc là một biến hoặc chức năng.
  • do đó : được đọc " 𝑥 là-a 𝜎 "
  • Có nghĩa là "là một yếu tố của"
  • (Gamma) là một môi trường.
  • (dấu hiệu khẳng định) có nghĩa là khẳng định (hoặc chứng minh, nhưng theo ngữ cảnh "khẳng định" đọc tốt hơn.)
  • ⊦ Γ 𝑥 : σ là như vậy, đọc "Γ khẳng định 𝑥 rằng, là một- σ "
  • 𝑒 là một ví dụ thực tế (element) của loại σ .
  • τ (tau) là một loại: hoặc cơ bản, biến ( α ), chức năng τ → τ 'hoặc sản phẩm τ × τ' (sản phẩm không được sử dụng ở đây)
  • 𝜏 → ' là một loại chức năng trong đó 𝜏' là các loại có khả năng khác nhau.
  • λ𝑥.𝑒 phương tiện λ (lambda) là một chức năng vô danh mà phải mất một cuộc tranh cãi, 𝑥 , và trả về một biểu thức, 𝑒 .

  • hãy 𝑥 = 𝑒₀ trong 𝑒₁ phương tiện trong ngôn luận, 𝑒₁ , thay 𝑒₀ bất cứ nơi nào 𝑥 xuất hiện.

  • nghĩa là phần tử trước là một kiểu con (không chính thức - lớp con) của phần tử sau.

  • α là một loại biến.
  • α.σ là một loại, ∀ (cho tất cả) các biến đối số, α , trở σ biểu
  • free (𝚪) có nghĩa không phải là một yếu tố của các biến loại tự do của 𝚪 được xác định trong bối cảnh bên ngoài. (Biến giới hạn là thay thế.)

Tất cả mọi thứ trên dòng là tiền đề, mọi thứ bên dưới là kết luận ( Per Martin-Löf )

Ưu tiên, ví dụ

Tôi đã lấy một số ví dụ phức tạp hơn từ các quy tắc và chèn các dấu ngoặc đơn thừa có ưu tiên:

  • : 𝜎 ∈ có thể được viết (𝑥: 𝜎)
  • Γ ⊦ 𝑥 : σ có thể được viết Γ ⊦ ( 𝑥 : σ )

  • Γ ⊦ hãy 𝑥 = 𝑒₀ trong 𝑒₁ : τ là tương đương Γ ⊦ (( hãy ( 𝑥 = 𝑒₀ ) trong 𝑒₁ ): τ )

  • 𝚪 ⊦ .𝑒 : 𝜏 → ' tương đương ⊦ (( 𝜆𝑥.𝑒 ): ( 𝜏 → 𝜏' ))

Sau đó, các khoảng trắng lớn ngăn cách các câu lệnh khẳng định và các điều kiện tiên quyết khác chỉ ra một tập hợp các điều kiện tiên quyết như vậy, và cuối cùng là tiền đề ngăn cách đường ngang từ kết luận đưa ra kết thúc của thứ tự ưu tiên.

Những quy định

Điều gì sau đây là các giải thích tiếng Anh của các quy tắc, mỗi sau đó là một sự nghỉ ngơi lỏng lẻo và một lời giải thích.

Biến đổi

Sơ đồ logic VAR

Cho là một loại (sigma), một phần tử của 𝚪 (Gamma),
kết luận khẳng định 𝑥 là một.

Nói cách khác, trong, chúng ta biết thuộc loại 𝜎 vì thuộc loại 𝜎 trong.

Điều này về cơ bản là một tautology. Tên định danh là một biến hoặc một chức năng.

Ứng dụng chức năng

Sơ đồ logic APP

Cho 𝚪 khẳng định 𝑒₀ là một loại chức năng và khẳng định 𝑒₁ là một 𝜏
kết luận 𝚪 khẳng định áp dụng chức năng 𝑒₀ cho là một loại 𝜏 '

Để lặp lại quy tắc, chúng ta biết rằng ứng dụng hàm trả về loại 𝜏 'vì hàm này có loại 𝜏 →' và nhận được một đối số của loại.

Điều này có nghĩa là nếu chúng ta biết rằng một hàm trả về một loại và chúng ta áp dụng nó cho một đối số, kết quả sẽ là một thể hiện của loại mà chúng ta biết nó trả về.

Chức năng trừu tượng hóa

Sơ đồ logic ABS

Cho 𝚪 và loại 𝜏 khẳng định 𝑒 là một loại, 𝜏 '
kết luận 𝚪 khẳng định một hàm ẩn danh, 𝜆 của biểu thức trả về, 𝑒 thuộc loại 𝜏 →'.

Một lần nữa, khi chúng ta thấy một hàm lấy và trả về một biểu thức, chúng ta biết nó thuộc loại 𝜏 → 'vì (a) khẳng định rằng 𝑒 là một'.

Nếu chúng ta biết thuộc loại 𝜏 và do đó một biểu thức 𝑒 thuộc loại 𝜏 ', thì hàm của biểu thức trả về 𝑒 thuộc loại 𝜏 →'.

Hãy khai báo biến

Sơ đồ logic LET

Cho 𝚪 khẳng định 𝑒₀, loại 𝜎 và, loại 𝜎, khẳng định 𝑒₁ loại 𝜏
kết luận khẳng định let𝑥 = 𝑒₀ inloại 𝜏

Một cách lỏng lẻo, bị ràng buộc với 𝑒₀ trong (a) vì là một và là một 𝜎 khẳng định 𝑒₁ là một.

Điều này có nghĩa là nếu chúng ta có một biểu thức đó là (là biến hoặc hàm) và một số tên,, cũng là và biểu thức loại 𝜏, thì chúng ta có thể thay thế cho 𝑥 bất cứ khi nào nó xuất hiện bên trong của 𝑒₁.

Khởi tạo

Sơ đồ logic

Cho 𝚪 khẳng định 𝑒 loại 𝜎 'và' là một kiểu con của
kết luận 𝚪 khẳng định 𝑒 thuộc loại 𝜎

Một biểu thức, 𝑒 thuộc kiểu cha vì biểu thức là kiểu con 'và là kiểu cha của 𝜎'.

Nếu một thể hiện thuộc loại là một kiểu con của loại khác, thì đó cũng là một thể hiện của loại siêu đó - loại tổng quát hơn.

Sự khái quát

Sơ đồ logic GEN

Cho 𝚪 khẳng định 𝑒 là 𝜎 không phải là phần tử của các biến tự do của,
kết luận khẳng định, nhập cho tất cả các biểu thức đối số 𝛼 trả về biểu thức

Vì vậy, nói chung, được gõ cho tất cả các biến đối số (𝛼) trả về, vì chúng ta biết rằng 𝑒 là một và không phải là biến tự do.

Điều này có nghĩa là chúng ta có thể khái quát hóa một chương trình để chấp nhận tất cả các loại đối với các đối số chưa bị ràng buộc trong phạm vi chứa (các biến không phải là không cục bộ). Các biến ràng buộc này là thay thế.

Để tất cả chúng cùng nhau

Với các giả định nhất định (chẳng hạn như không có biến tự do / không xác định, môi trường đã biết), chúng tôi biết các loại:

  • yếu tố nguyên tử của các chương trình của chúng tôi (Biến),
  • các giá trị được trả về bởi các hàm (Ứng dụng hàm),
  • cấu trúc chức năng (Trừu tượng chức năng),
  • hãy để các ràng buộc (Hãy khai báo biến),
  • các kiểu cha mẹ (Khởi tạo) và
  • tất cả các biểu thức (Khái quát hóa).

Phần kết luận

Các quy tắc này kết hợp cho phép chúng tôi chứng minh loại chung nhất của chương trình được xác nhận, mà không yêu cầu chú thích loại.


1
Aaron tóm tắt tốt!
bhurlow

48

Các ký hiệu xuất phát từ suy luận tự nhiên .

Biểu tượng is được gọi là quay vòng .

6 quy tắc rất dễ dàng.

Var quy tắc là quy tắc khá tầm thường - nó nói rằng nếu loại định danh đã có trong môi trường loại của bạn, thì để suy ra loại bạn chỉ lấy nó từ môi trường.

Appquy tắc nói rằng nếu bạn có hai mã định danh e0e1có thể suy ra các loại của chúng, thì bạn có thể suy ra loại ứng dụng e0 e1. Quy tắc sẽ đọc như thế này nếu bạn biết điều đó e0 :: t0 -> t1e1 :: t0(cùng t0!), Thì ứng dụng được gõ tốt và loại làt1 .

AbsLetlà các quy tắc để suy ra các loại cho lambda trừu tượng và cho phép.

Inst quy tắc nói rằng bạn có thể thay thế một loại bằng loại ít chung hơn.


4
Đây là tính toán tuần tự, không phải là khấu trừ tự nhiên.
Roman Cheplyaka

12
@RomanCheplyaka tốt, ký hiệu rất giống nhau. Bài viết trên wikipedia có một so sánh thú vị về hai kỹ thuật: en.wikipedia.org/wiki/Natural_dedraction#Sequent_calculus . Tính toán tuần tự được sinh ra để đáp ứng trực tiếp với những thất bại của suy luận tự nhiên, vì vậy nếu câu hỏi là "ký hiệu này đến từ đâu", thì "suy luận tự nhiên" về mặt kỹ thuật là một câu trả lời đúng hơn.
Dan Burton

2
@RomanCheplyaka Một xem xét khác là phép tính tuần tự hoàn toàn là cú pháp (đó là lý do tại sao có rất nhiều quy tắc cấu trúc) trong khi ký hiệu này thì không. Quy tắc đầu tiên giả định rằng bối cảnh là một tập hợp trong khi tính toán tuần tự, đó là một cấu trúc cú pháp đơn giản hơn.
nponeccop

@Cheplyaka thực sự, không, nó có một cái gì đó trông giống như "tuần tự" nhưng nó không phải là phép tính liên tiếp. Haper phát triển sự hiểu biết về điều này trong sách giáo khoa của mình như là một "phán quyết cấp cao hơn." Đây thực sự là suy luận tự nhiên.
Philip JF

15

Có hai cách nghĩ về e:. Một là "biểu thức e có kiểu σ", một biểu thức khác là "cặp theo thứ tự của biểu thức e và kiểu σ".

Xem là kiến ​​thức về các loại biểu thức, được triển khai dưới dạng tập hợp các cặp biểu thức và loại, e:.

Cửa quay ⊢ có nghĩa là từ kiến ​​thức bên trái, chúng ta có thể suy ra những gì ở bên phải.

Do đó, quy tắc đầu tiên [Var] có thể được đọc:
Nếu kiến ​​thức của chúng ta Γ chứa cặp e:, thì chúng ta có thể suy ra từ Γ rằng e có loại.

Quy tắc thứ hai [Ứng dụng] có thể được đọc:
Nếu chúng ta từ Γ có thể suy ra rằng e_0 có loại τ → 'và chúng ta từ có thể suy ra rằng e_1 có loại, thì chúng ta từ có thể suy ra rằng e_0 e_1 có loại τ '.

Viết, e: thay vì ∪ {e:}.

Do đó, quy tắc thứ ba [abs] có thể được đọc:
Nếu chúng ta từ Γ mở rộng với x: có thể suy ra rằng e có loại τ ', thì chúng ta từ Γ có thể suy ra rằng λx.e có loại τ →'.

Quy tắc thứ tư [Let] được để lại như một bài tập. :-)

Quy tắc thứ năm [Inst] có thể được đọc:
Nếu chúng ta từ có thể suy ra rằng e có loại σ 'và' là một kiểu con của, thì chúng ta từ có thể suy ra rằng e có loại.

Quy tắc thứ sáu và cuối cùng [Gen] có thể được đọc:
Nếu chúng ta từ có thể suy ra rằng e có loại và α không phải là biến loại tự do trong bất kỳ loại nào trong, thì chúng ta từ có thể suy ra rằng e có loại ∀α.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.