This repository has no description www.jonmsterling.com/01HC/
dependent-types proof-assistant swift
3

Configure Feed

Select the types of activity you want to include in your feed.

Add RecordProj rule

Jon Sterling (Mar 3, 2026, 2:24 PM UTC) cd8dec2d bfe4a22f

+39 -1
+36
Sources/PterodactylBuild/Elaborator/ElabRules.swift
··· 577 577 } 578 578 } 579 579 580 + struct RecordProj: ElabTypedTerm, HasProvenance { 581 + let provenance: Range<Int>? 582 + let target: ElabTypedTerm 583 + let fieldName: String 584 + 585 + func elabTypedTerm(_ env: ElabEnv) async throws(ElabError) -> (Value.Type_, Term) { 586 + let (recordType, recordTerm) = try await target.elabTypedTerm(env) 587 + switch await recordType.whnf() { 588 + case let .recordType(fields: fields): 589 + 590 + guard let field = fields[fieldName] else { 591 + throw ElabError( 592 + Diagnostic( 593 + message: "This record does not have a field named `\(fieldName)`.", 594 + severity: .warning, 595 + absoluteRange: provenance 596 + ) 597 + ) 598 + } 599 + 600 + let recordValue = await env.evaluator().evaluate(term: recordTerm) 601 + let fieldType = field.type.instantiate(with: recordValue) 602 + return (fieldType, .cut(term: recordTerm, frame: .proj(fieldName: fieldName))) 603 + 604 + default: 605 + throw ElabError( 606 + Diagnostic( 607 + message: "Cannot project from element of non-record type.", 608 + severity: .warning, 609 + absoluteRange: provenance 610 + ) 611 + ) 612 + } 613 + } 614 + } 615 + 580 616 struct Lambda: ElabTerm, HasProvenance { 581 617 let provenance: Range<Int>? 582 618 let binder: UntypedBinder
+3 -1
examples/test.ptero
··· 1 1 2 2 exampleRecord : (A : Type) (x : A) -> {tp : Type; elt : tp} 3 - exampleRecord A x => {tp => A; elt => x} 3 + exampleRecord A x => {tp => A; elt => x} 4 + 5 + foo : {tp:Type} -> Type