From ed34302627874d9afa5adcf01dcd2f9661a4a5f6 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Sat, 25 Nov 2023 23:19:36 -0800 Subject: [PATCH] Add a function to substitute all variables for their values --- src/Bergamot/Syntax.elm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Bergamot/Syntax.elm b/src/Bergamot/Syntax.elm index 01cafbc..6c239be 100644 --- a/src/Bergamot/Syntax.elm +++ b/src/Bergamot/Syntax.elm @@ -1,4 +1,4 @@ -module Bergamot.Syntax exposing (Term(..), instantiate, emptyInstantiationState, unify, emptyUnificationState) +module Bergamot.Syntax exposing (Term(..), instantiate, emptyInstantiationState, unify, emptyUnificationState, reify) import Set exposing (Set) import Dict exposing (Dict) @@ -120,3 +120,17 @@ unify t1 t2 us = (Var v1, _) -> set v1 t2 us (_, Var v2) -> set v2 t1 us _ -> Nothing + +reify : Term UnificationVar -> UnificationState -> Term UnificationVar +reify t us = + case t of + IntLit i -> IntLit i + StringLit s -> StringLit s + Call n ts -> Call n (List.map (\tp -> reify tp us) ts) + Var v -> + case Dict.get v us of + Just ui -> + case ui.term of + Just tp -> reify tp us + _ -> Var v + Nothing -> Var v