public static void Main() { while (true) { try { String invoer = Console.ReadLine(); IFormule formule = Parser.ParseFormule(invoer); Valuatie valuatie = Solver.Vervulbaar(formule); if (valuatie == null) { Console.WriteLine("UNSAT"); } else { Console.WriteLine("SAT\n" + valuatie); } } catch (Exception exc) { Console.WriteLine("FOUT: " + exc.Message); } break; } }
public bool KanOnwaar(Valuatie v) { // Een propositie kan onwaar zijn als er nog geen valuatie aan is toegekend, of de valuatie onwaar is if (!v.BevatVariabele(variabele)) { return(true); } return(!v.GeefWaarde(variabele)); }
/* * Deze methode geeft een Valuatie terug die de gegeven Formule vervult. * Wanneer zo'n Valuatie niet bestaat geeft hij de waarde null terug. * * Deze methode roept de gelijknamige recursieve methode met 3 parameters aan, met de volgende initiele waarden: * - formule de gegeven Formule, * - variabelen de Set van alle variabelen uit de Formule, verkregen door eerst de methode Verzamel aan te roepen, * - valuatie de lege valuatie. */ public static Valuatie Vervulbaar(IFormule formule) { if (formule == null) { return(null); } SortedSet <string> variabelen = new SortedSet <string>(); formule.Verzamel(variabelen); Valuatie valuatie = new Valuatie(); return(Vervulbaar(formule, variabelen, valuatie)); }
/* * Deze methode controleert de vervulbaarheid van een formule voor een bepaalde waarde voor een enkele variabele */ private static Valuatie VervulbaarVoorWaarde(IFormule formule, SortedSet <string> variabelen, Valuatie valuatie, string var, bool waarde) { // Voeg variabele toe aan valuatie valuatie.VoegToe(var, waarde); // Controleer of formule waar kan zijn if (formule.KanWaar(valuatie)) { // Controleer recursief Valuatie resultaat = Vervulbaar(formule, variabelen, valuatie); // Als er een resultaat is, return deze if (resultaat != null) { return(resultaat); } } // Anders verwijder de variabele weer uit de valuatie en return null valuatie.Verwijder(var); return(null); }
/* * Deze recursieve methode krijgt een Formule, een Set van nog te valueren variabelen, * en een Valuatie voor een deel van de variabelen. * * Deze methode geeft een Valuatie terug die de gegeven formule vervult. * Wanneer zo'n Valuatie niet bestaat geeft hij de waarde null terug. */ private static Valuatie Vervulbaar(IFormule formule, SortedSet <string> variabelen, Valuatie valuatie) { Valuatie resultaat; string var = GetElement(variabelen); if (var == null) { return(valuatie); } // Haal variabele uit lijst van te checken variabelen variabelen.Remove(var); // Controleer of formule vervulbaar is voor de waarde (eerst waar, want als zowel waar als onwaar mogelijk is, wordt waar gekozen) resultaat = VervulbaarVoorWaarde(formule, variabelen, valuatie, var, true); if (resultaat != null) { return(resultaat); } resultaat = VervulbaarVoorWaarde(formule, variabelen, valuatie, var, false); if (resultaat != null) { return(resultaat); } return(null); }
public bool KanOnwaar(Valuatie v) { // Een conjuctie kan onwaar zijn als één of beide van de elementen onwaar kunnen zijn return(links.KanOnwaar(v) || rechts.KanOnwaar(v)); }
public bool KanWaar(Valuatie v) { // Een conjuctie kan enkel waar zijn als beide elementen waar kunnen zijn return(links.KanWaar(v) && rechts.KanWaar(v)); }
public bool Waarde(Valuatie v) { return(links.Waarde(v) && rechts.Waarde(v)); }
public bool Waarde(Valuatie v) { return(v.GeefWaarde(variabele)); }
public bool KanOnwaar(Valuatie v) { // Een negatie kan onwaar zijn als return(formule.KanWaar(v)); }
public bool KanWaar(Valuatie v) { // Een negatie kan waar zijn als het element onwaar kan zijn return(formule.KanOnwaar(v)); }
public bool Waarde(Valuatie v) { return(!formule.Waarde(v)); }
public bool KanOnwaar(Valuatie v) { // Een disjunctie kan enkel onwaar zijn als beide elementen onwaar kunnen zijn return(links.KanOnwaar(v) && rechts.KanOnwaar(v)); }
public bool KanWaar(Valuatie v) { // Een disjunctie kan waar zijn als één of beide van de elementen waar kunnen zijn return(links.KanWaar(v) || rechts.KanWaar(v)); }