diff --git a/src/runtime/haskell/PGF/TypeCheck.hs b/src/runtime/haskell/PGF/TypeCheck.hs index d68e9cf40..bc8304a2b 100644 --- a/src/runtime/haskell/PGF/TypeCheck.hs +++ b/src/runtime/haskell/PGF/TypeCheck.hs @@ -351,6 +351,7 @@ tcExpr scope (EMeta _) tty = do return (EMeta i) tcExpr scope e0 tty = do (e0,tty0) <- infExpr scope e0 + (e0,tty0) <- appImplArg scope e0 tty0 i <- newGuardedMeta e0 eqType scope (scopeSize scope) i tty tty0 return (EMeta i) @@ -424,6 +425,14 @@ tcArg scope e1 e2 delta ty0@(DTyp ((Implicit,x,ty):hs) c es) = do then tcArg scope (EApp e1 (EImplArg (EMeta i))) e2 delta (DTyp hs c es) else tcArg scope (EApp e1 (EImplArg (EMeta i))) e2 (VMeta i (scopeEnv scope) [] : delta) (DTyp hs c es) +appImplArg scope e (TTyp delta (DTyp ((Implicit,x,ty1):hypos) cat es)) = do + i <- newMeta scope (TTyp delta ty1) + let delta' = if x == wildCId + then delta + else VMeta i (scopeEnv scope) [] : delta + appImplArg scope (EApp e (EImplArg (EMeta i))) (TTyp delta' (DTyp hypos cat es)) +appImplArg scope e tty = return (e,tty) + ----------------------------------------------------- -- eqType ----------------------------------------------------- diff --git a/testsuite/runtime/typecheck/Graph.gf b/testsuite/runtime/typecheck/Graph.gf index a44cf35b5..4f18cd589 100644 --- a/testsuite/runtime/typecheck/Graph.gf +++ b/testsuite/runtime/typecheck/Graph.gf @@ -16,4 +16,6 @@ fun link : ({n,m} : Node) -> Link n m -> Path n m ; join : ({n,p,m} : Node) -> Link n p -> Path p m -> Path n m ; -} \ No newline at end of file + + id : ({n} : Node) -> Link n n ; +} diff --git a/testsuite/runtime/typecheck/hard-unification.gfs b/testsuite/runtime/typecheck/hard-unification.gfs index 512163c0f..0e257f2a4 100644 --- a/testsuite/runtime/typecheck/hard-unification.gfs +++ b/testsuite/runtime/typecheck/hard-unification.gfs @@ -1,3 +1,3 @@ -i testsuite/runtime/typecheck/Hard.gf +i -src testsuite/runtime/typecheck/Hard.gf ai s ? (app ?) ex ai s ? (app ?) ? diff --git a/testsuite/runtime/typecheck/hard-unification.gfs.gold b/testsuite/runtime/typecheck/hard-unification.gfs.gold index c83c4f620..9ca737384 100644 --- a/testsuite/runtime/typecheck/hard-unification.gfs.gold +++ b/testsuite/runtime/typecheck/hard-unification.gfs.gold @@ -1,5 +1,6 @@ -Expression: s (\v0 -> v0) (app (\v0 -> v0)) ex -Type: S +Expression: s (\v0 -> v0) (app (\v0 -> v0)) ex +Type: S +Probability: 1.0 Meta variable(s) ?2 should be resolved in the expression: s ?2 (app ?2) ?4 diff --git a/testsuite/runtime/typecheck/implicit-arguments.gfs b/testsuite/runtime/typecheck/implicit-arguments.gfs index c2be00d21..5667a2647 100644 --- a/testsuite/runtime/typecheck/implicit-arguments.gfs +++ b/testsuite/runtime/typecheck/implicit-arguments.gfs @@ -6,4 +6,5 @@ ai ai ai <\x -> x : ({m},n : Node) -> Node> ai Node> -ai Node> \ No newline at end of file +ai Node> +ai diff --git a/testsuite/runtime/typecheck/implicit-arguments.gfs.gold b/testsuite/runtime/typecheck/implicit-arguments.gfs.gold index 85448469a..e0a83f5b6 100644 --- a/testsuite/runtime/typecheck/implicit-arguments.gfs.gold +++ b/testsuite/runtime/typecheck/implicit-arguments.gfs.gold @@ -1,22 +1,33 @@ -Expression: join {n1} {n2} {n3} l12 (link {n2} {n3} l23) -Type: Path n1 n3 +Expression: join {n1} {n2} {n3} l12 (link {n2} {n3} l23) +Type: Path n1 n3 +Probability: 1.0000000000000002e-2 -Expression: join {n1} {n2} {n3} l12 (link {n2} {n3} l23) -Type: Path n1 n3 +Expression: join {n1} {n2} {n3} l12 (link {n2} {n3} l23) +Type: Path n1 n3 +Probability: 1.0000000000000002e-2 -Expression: -Type: Label {?1} +Expression: +Type: Label {?1} +Probability: 1.0 -Expression: -Type: Label {n1} +Expression: +Type: Label {n1} +Probability: 1.0 {n1} is implicit argument but not implicit argument is expected here -Expression: <\{_1}, x -> x : ({m} : Node) -> (n : Node) -> Node> -Type: ({m} : Node) -> (n : Node) -> Node +Expression: <\{_1}, x -> x : ({m} : Node) -> (n : Node) -> Node> +Type: ({m} : Node) -> (n : Node) -> Node +Probability: 1.0 -Expression: <\{_1} -> n1 : ({m} : Node) -> Node> -Type: ({m} : Node) -> Node +Expression: <\{_1} -> n1 : ({m} : Node) -> Node> +Type: ({m} : Node) -> Node +Probability: 1.0 -Expression: <\{_1} -> ?1 : ({m} : Node) -> Node> -Type: ({m} : Node) -> Node +Expression: <\{_1} -> ?1 : ({m} : Node) -> Node> +Type: ({m} : Node) -> Node +Probability: 1.0 + +Expression: +Type: Path n1 n1 +Probability: 1.0 diff --git a/testsuite/runtime/typecheck/typecheck.gfs.gold b/testsuite/runtime/typecheck/typecheck.gfs.gold index c7f28b75b..048b6d892 100644 --- a/testsuite/runtime/typecheck/typecheck.gfs.gold +++ b/testsuite/runtime/typecheck/typecheck.gfs.gold @@ -12,39 +12,48 @@ unknown category of function identifier unknown_fun Category unknown_cat is not in scope Cannot infer the type of expression \x -> x A function type is expected for the expression \x -> x instead of type Int -Expression: append (succ (succ zero)) (succ zero) (vector (succ (succ zero))) (vector (succ zero)) -Type: Vector (succ (succ (succ zero))) +Expression: append (succ (succ zero)) (succ zero) (vector (succ (succ zero))) (vector (succ zero)) +Type: Vector (succ (succ (succ zero))) +Probability: 3.532127097800926e-8 -Expression: <\m, n -> vector (plus m n) : (m : Nat) -> (n : Nat) -> Vector (plus m n)> -Type: (m : Nat) -> (n : Nat) -> Vector (plus m n) +Expression: <\m, n -> vector (plus m n) : (m : Nat) -> (n : Nat) -> Vector (plus m n)> +Type: (m : Nat) -> (n : Nat) -> Vector (plus m n) +Probability: 1.0 -Expression: mkMorph (\x -> succ zero) -Type: Morph (\v0 -> succ zero) +Expression: mkMorph (\x -> succ zero) +Type: Morph (\v0 -> succ zero) +Probability: 0.5 -Expression: idMorph (mkMorph (\x -> x)) -Type: Nat +Expression: idMorph (mkMorph (\x -> x)) +Type: Nat +Probability: 0.125 Couldn't match expected type Morph (\v0 -> v0) against inferred type Morph (\v0 -> succ zero) In the expression: mkMorph (\x -> succ zero) -Expression: Vector (succ zero) -> Vector (succ zero)> -Type: Vector zero -> Vector (succ zero) -> Vector (succ zero) +Expression: Vector (succ zero) -> Vector (succ zero)> +Type: Vector zero -> Vector (succ zero) -> Vector (succ zero) +Probability: 1.0 -Expression: <\n, v1, n1, v2 -> append n n1 v1 v2 : (n : Nat) -> Vector n -> (m : Nat) -> Vector m -> Vector (plus n m)> -Type: (n : Nat) -> Vector n -> (m : Nat) -> Vector m -> Vector (plus n m) +Expression: <\n, v1, n1, v2 -> append n n1 v1 v2 : (n : Nat) -> Vector n -> (m : Nat) -> Vector m -> Vector (plus n m)> +Type: (n : Nat) -> Vector n -> (m : Nat) -> Vector m -> Vector (plus n m) +Probability: 1.0 Category EQ is not in scope -Expression: <\v1, v2 -> cmpVector ?7 v1 v2 : Vector ?7 -> Vector ?7 -> Int> (vector ?7) -Type: Vector ?7 -> Int +Expression: <\v1, v2 -> cmpVector ?7 v1 v2 : Vector ?7 -> Vector ?7 -> Int> (vector ?7) +Type: Vector ?7 -> Int +Probability: 0.3333333333333333 Couldn't match expected type (m : Nat) -> Vector ?1 against inferred type (n : Nat) -> Vector n In the expression: vector -Expression: f1 (\v -> v) vector -Type: Int +Expression: f1 (\v -> v) vector +Type: Int +Probability: 5.555555555555555e-2 -Expression: f1 (\v -> succ v) (\x -> vector (succ x)) -Type: Int +Expression: f1 (\v -> succ v) (\x -> vector (succ x)) +Type: Int +Probability: 0.16666666666666666 Couldn't match expected type Vector x against inferred type Vector (succ x) @@ -52,22 +61,25 @@ In the expression: vector (succ x) Couldn't match expected type Vector n against inferred type Vector (succ n) In the expression: vector (succ n) -Expression: h ?2 (u0 ?2) -Type: Int +Expression: h ?2 (u0 ?2) +Type: Int +Probability: 8.333333333333333e-2 Couldn't match expected type U ?2 ?2 against inferred type U ?2 (succ ?2) In the expression: u1 ?2 Meta variable(s) ?11 should be resolved in the expression: cmpVector (succ (succ zero)) (vector (succ (succ zero))) (append ?11 (succ zero) (vector ?11) (vector (succ zero))) -Expression: diff (succ (succ (succ zero))) (succ (succ zero)) (vector (succ (succ (succ (succ (succ zero)))))) (vector (succ (succ (succ zero)))) -Type: Vector (succ (succ zero)) +Expression: diff (succ (succ (succ zero))) (succ (succ zero)) (vector (succ (succ (succ (succ (succ zero)))))) (vector (succ (succ (succ zero)))) +Type: Vector (succ (succ zero)) +Probability: 2.1558392930913853e-12 Couldn't match expected type Vector (plus (succ (succ (succ zero))) (succ (succ zero))) against inferred type Vector (succ (succ (succ (succ zero)))) In the expression: vector (succ (succ (succ (succ zero)))) -Expression: idMorph (mkMorph2 (\x -> x) (vector zero)) -Type: Nat +Expression: idMorph (mkMorph2 (\x -> x) (vector zero)) +Type: Nat +Probability: 1.0416666666666666e-2 Couldn't match expected type Vector zero against inferred type Vector n