{-# LANGUAGE LambdaCase #-}
module TPDB.CPF.Proof.Util where

import qualified Data.Map as M
import           Data.List (nub)
import           TPDB.Data
import           TPDB.CPF.Proof.Type hiding (name)
import           TPDB.DP
import Data.String (fromString)

fromMarkedIdentifier :: Marked Identifier -> Symbol
fromMarkedIdentifier = \case
  Original i -> SymName i
  Marked i   -> SymSharp $ SymName i

sortVariables :: Rule (Term Identifier s) -> Rule (Term Identifier s)
sortVariables r = r { lhs = vmap mapVar $ lhs r
                    , rhs = vmap mapVar $ rhs r
                    }
  where
    oldVars      = nub $ voccs $ lhs r
    newVars      = zipWith mkNewVar [1..] oldVars
    mkNewVar i v = v { name = fromString $ "x" ++ show i }
    mapping      = M.fromList $ zip oldVars newVars
    mapVar v     = case M.lookup v mapping of
      Just v' -> v'
      Nothing -> error "TPDB.CPF.Proof.Util.sortVariables"