public override void Substitute(IRVariable variable, IRExpression expression)
 {
     if (ReferenceEquals(Pointer, variable))
     {
         Pointer = expression.CloneComplete();
     }
     else
     {
         Pointer.Substitute(variable, expression);
     }
 }
 public override void Substitute(IRVariable variable, IRExpression expression)
 {
     for (int i = 0; i < Arguments.Count; i++)
     {
         if (ReferenceEquals(Arguments[i], variable))
         {
             Arguments[i] = expression.CloneComplete();
         }
         else
         {
             Arguments[i].Substitute(variable, expression);
         }
     }
 }
        public override void Substitute(IRExpression template, IRExpression substitution, OnMatchFoundHandler callback)
        {
            Pointer.Substitute(template, substitution, callback);
            var mapping = new Dictionary <IRVariable, IRExpression>();

            if (Pointer.Unify(template, mapping) && callback(mapping))
            {
                if (substitution is IRVariable v)
                {
                    Pointer = mapping[v].CloneComplete();
                }
                else
                {
                    var newExpr = substitution.CloneComplete();
                    foreach (var varMap in mapping)
                    {
                        newExpr.Substitute(varMap.Key, varMap.Value);
                    }
                    Pointer = newExpr;
                }
            }
        }