Exemplo n.º 1
0
 public RefinementProofGenerator(Program i_prog, ModuleDefinition i_mProof, Resolver.ModuleBindings i_bindings)
 {
     prog     = i_prog;
     mProof   = i_mProof;
     bindings = i_bindings;
     mLow     = null;
     mHigh    = null;
     strategy = null;
 }
Exemplo n.º 2
0
        private bool GetLevelsAndStrategy()
        {
            foreach (var d in mProof.TopLevelDecls)
            {
                if (d is RefinementParametersDecl)
                {
                    var refinement = (RefinementParametersDecl)d;
                    if (mLow != null || mHigh != null)
                    {
                        AH.PrintError(prog, $"More than one 'refinement' declaration found in proof module {mProof.Name}");
                        return(false);
                    }
                    if (!LookupLevel(refinement.LowLevel, "low-level", out mLow))
                    {
                        return(false);
                    }
                    if (!LookupLevel(refinement.HighLevel, "high-level", out mHigh))
                    {
                        return(false);
                    }
                }
                else if (d is StrategyDecl)
                {
                    if (strategy != null)
                    {
                        AH.PrintError(prog, $"More than one strategy found in proof module {mProof.Name}");
                        return(false);
                    }
                    strategy = (StrategyDecl)d;
                }
            }

            if (mLow == null || mHigh == null)
            {
                AH.PrintError(prog, $"No 'refinement' declaration found in proof module {mProof.Name}");
                return(false);
            }
            if (strategy == null)
            {
                AH.PrintError(prog, $"No strategy given in proof module {mProof.Name}");
                return(false);
            }

            symbolsLow  = mLow.ModuleDef.ArmadaSymbols;
            symbolsHigh = mHigh.ModuleDef.ArmadaSymbols;

            return(true);
        }