Example #1
0
        public IActionResult SolveTableau([FromBody] TableauInput tableauInput)
        {
            if (tableauInput == null || !HasValidFormulas(tableauInput))
            {
                return(BadRequest("The request could not be understood by the server due to malformed syntax."));
            }

            var tableauSolution = TableauSolutionService.ComputeTableauSolution(tableauInput);

            EventService.LogTableauSolution(tableauSolution);

            return(Ok(tableauSolution));
        }
Example #2
0
        public TableauSolution ComputeTableauSolution(TableauInput tableauInput)
        {
            var solutionTableau = TableauSolver.Solve(tableauInput);

            var tableauSolution = new TableauSolution()
            {
                SolutionNode    = solutionTableau,
                TableauInput    = tableauInput,
                RequestDateTime = DateTime.Now
            };

            return(tableauSolution);
        }
Example #3
0
        public SolutionNode Solve(TableauInput input)
        {
            var initialBranch = new Branch();

            initialBranch.AddNewFormula(new BranchItem(input.TableauRoot));

            if (input.TheoryAxioms == null)
            {
                input.TheoryAxioms = new List <TableauInputNode>();
            }

            foreach (var axiom in input.TheoryAxioms)
            {
                initialBranch.AddAxiom(new BranchItem(axiom));
            }

            return(initialBranch.Develop());
        }
        ParseTableauInput(UnparsedTableauInput unparsedTableauInput)
        {
            if (!unparsedTableauInput.HasAtleastOneParseRequest())
            {
                throw new ConversionException("Unparsed tableau input must contain atleast one formula to parse");
            }

            if ((from request in unparsedTableauInput.FormulaParseRequests
                 where request.UnparsedTableauNode.Formula == null
                 select request).Any())
            {
                throw new ConstraintException("Unparsed tableau input contains null string as formula's string representation");
            }

            var parsedTableauNodes = new List <ParsedTableauNode>();

            try {
                foreach (var request in unparsedTableauInput.FormulaParseRequests)
                {
                    if (request.ErrorResponse != string.Empty)
                    {
                        continue;
                    }

                    try {
                        var formula = FormulaFactory.Parse(request.UnparsedTableauNode.Formula);
                        parsedTableauNodes.Add(new ParsedTableauNode()
                        {
                            Formula    = formula,
                            TruthLabel = request.UnparsedTableauNode.TruthLabel
                        });
                    }
                    catch (ParseException ex) {
                        request.ErrorResponse = ex.Message;
                    }
                }
            }
            catch (Exception ex) {
                throw new ConversionException($"Formula parser exception {ex.Message}");
            }

            if (unparsedTableauInput.HasErrorResponse())
            {
                return(new TableauInput(), unparsedTableauInput);
            }

            var tableauInput = new TableauInput()
            {
                TableauRoot = new TableauInputNode()
                {
                    Formula    = parsedTableauNodes[0].Formula,
                    TruthLabel = parsedTableauNodes[0].TruthLabel
                },
                TheoryAxioms = (from request in parsedTableauNodes.Skip(1)
                                let axiom = new TableauInputNode()
                {
                    Formula = request.Formula, TruthLabel = request.TruthLabel
                } select axiom).ToList()
            };

            return(tableauInput, new UnparsedTableauInput());
        }
Example #5
0
 private bool HasValidFormulas(TableauInput tableauInput)
 {
     return(tableauInput.GetAllNodes().All(tableauInputNode => tableauInputNode.Formula.Apply(FormulaValidator)));
 }