% Autor: MB % Datum: 11.05.2016 % Aussagenlogik % Version May 2016 :- consult('LogikHilfspraedikate'). /* Wir testen eine Formel in der Sprache der unten stehenden Junktoren, etwa: wenn_dann(P, wenn_dann(Q,P)). oder(P, nicht(P)). usw. Um die Gueltigkeit festzustellen, wird die Anzahl der Variablen der Formel bestimmt und dann ueberprueft, ob die Anzahl der Loesungen, diese Formel wahr zu machen, mit der Zahl der kombinatorisch moeglichen Belegungen uebereinstimmt. */ ueberpruefe(Formel):- flacheTermliste(Formel,Termliste), anzahlVariablen(Termliste,_,N), Belegungen is 2 ** N, findall(_,berechne(Formel,w),Loesungsliste), length(Loesungsliste,Belegungen), writeln('Die Formel ist aussagenlogisch gültig!'), !. ueberpruefe(_):- writeln('Die Formel ist nicht aussagenlogisch gültig!'). % Test fuer Hilbert/Ackermann Axiom 1: ueberpruefe(wenn_dann(P, wenn_dann(Q,P))). % Test fuer Transitivitaet: ueberpruefe(wenn_dann(und(wenn_dann(P,Q),wenn_dann(Q,R)), wenn_dann(P,R))). % Test fuer ungueltige Formel: ueberpruefe(wenn_dann(P,wenn_dann(P,Q))). % Aussagenlogische Wahrheitsbedingungen nicht(A):- berechne(A, AE), % die evtl. komplexe Aussage im Skopus auswerten nicht(AE, w). nicht(w, f). nicht(f, w). und(A, B):- berechne(A, AE), berechne(B, BE), und(AE, BE, w). und(w, w, w). und(w, f, f). und(f, w, f). und(f, f, f). oder(A, B):- berechne(A, AE), berechne(B, BE), oder(AE, BE, w). oder(w, w, w). oder(w, f, w). oder(f, w, w). oder(f, f, f). entweder_oder(A, B):- berechne(A, AE), berechne(B, BE), entweder_oder(AE, BE, w). entweder_oder(w, w, f). entweder_oder(w, f, w). entweder_oder(f, w, w). entweder_oder(f, f, f). wenn_dann(A, B):- berechne(A, AE), berechne(B, BE), wenn_dann(AE, BE, w). wenn_dann(w, w, w). wenn_dann(w, f, f). wenn_dann(f, w, w). wenn_dann(f, f, w). genau_dann(A, B):- berechne(A, AE), berechne(B, BE), genau_dann(AE, BE, w). genau_dann(w, w, w). genau_dann(w, f, f). genau_dann(f, w, f). genau_dann(f, f, w). berechne(w, w). berechne(f, f):- !. berechne(nicht(A), B):- berechne(A, AE), nicht(AE, B). berechne(und(A, B), C):- berechne(A, AE), berechne(B, BE), und(AE, BE, C). berechne(oder(A, B), C):- berechne(A, AE), berechne(B, BE), oder(AE, BE, C). berechne(entweder_oder(A, B), C):- berechne(A, AE), berechne(B, BE), entweder_oder(AE, BE, C). berechne(wenn_dann(A, B), C):- berechne(A, AE), berechne(B, BE), wenn_dann(AE, BE, C). berechne(genau_dann(A, B), C):- berechne(A, AE), berechne(B, BE), genau_dann(AE, BE, C).