示例#1
0
        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;
            }
        }
示例#2
0
 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));
 }
示例#3
0
        /*
         * 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));
        }
示例#4
0
 /*
  * 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);
 }
示例#5
0
        /*
         * 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);
        }
示例#6
0
 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));
 }
示例#7
0
 public bool KanWaar(Valuatie v)
 {
     // Een conjuctie kan enkel waar zijn als beide elementen waar kunnen zijn
     return(links.KanWaar(v) && rechts.KanWaar(v));
 }
示例#8
0
 public bool Waarde(Valuatie v)
 {
     return(links.Waarde(v) && rechts.Waarde(v));
 }
示例#9
0
 public bool Waarde(Valuatie v)
 {
     return(v.GeefWaarde(variabele));
 }
示例#10
0
 public bool KanOnwaar(Valuatie v)
 {
     // Een negatie kan onwaar zijn als
     return(formule.KanWaar(v));
 }
示例#11
0
 public bool KanWaar(Valuatie v)
 {
     // Een negatie kan waar zijn als het element onwaar kan zijn
     return(formule.KanOnwaar(v));
 }
示例#12
0
 public bool Waarde(Valuatie v)
 {
     return(!formule.Waarde(v));
 }
示例#13
0
 public bool KanOnwaar(Valuatie v)
 {
     // Een disjunctie kan enkel onwaar zijn als beide elementen onwaar kunnen zijn
     return(links.KanOnwaar(v) && rechts.KanOnwaar(v));
 }
示例#14
0
 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));
 }