Prolog: Überprüfen ob eine boolsche Funktion monton ist oder nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Prolog: Überprüfen ob eine boolsche Funktion monton ist oder nicht

    Hallo!
    Ich versuche seit einigen Tagen ein vermutlich einfaches Prolog Programm hinzubekommen. Ich möchte eine Prädikat definieren welches mir überprüft ob eine gegebene boolsche Funktion monoton ist oder nicht. Ich habe mir gedacht ich probiere das damit, dass ich zwei Listen erstelle die Werte einsetze und damit überpüfe ob die boolsche Funktion monoton ist oder nicht. Ist das der richtige Weg oder gibt es da einen anderen. Ich komme da einfach nicht weiter, ist das überhaupt so richtig?

    Ich bin für jede Hilfe dankbar!!!!
    Florian
  • Hallo!
    Darüber rätsle ich jetzt auch noch, bin derweil einmal zum zweiten Teil gegangen und möchte den fertig bekommen, ehe ich mich mit dem ersten Problem beschäftige. Allerdings habe ich da auch Fragen damit icvh weiterkomme. Tut mir leid.

    Ziel ist es ein Prädikat self_dual/1 zu schreiben welches eine boolsche Funktion die ich per Paramter übergebe überpürft ob sie self_dual ist, d.h. f(not(x1)....,not(xn)) = not(f(x1,...,xn)).

    Ich habe es bisher geschafft ein Prädikat check zu erstellen welches mir das richtige Ergebnis ausgibt, nur sollte das dynamisch gehen, das heißt das Prädikat soll zuerst die Anzahl der Argumente vermutlich mithilfe von arity herausfinden, dann damit die richtige Listen erzeugen und überpürfen. Mein derzeitiger Code schaut so aus:

    Quellcode

    1. % das ist eine gegeben funktion mit 2 Paramtern %
    2. f(A,B,0) :- 0 is A xor B.
    3. arity(f,2).
    4. % statische überprüfung auf self_dual von Funktion %
    5. or(A,B) :- A; B.
    6. check(A,B) :- or(not(A),B),or(A,not(B)).
    7. numberOfArgument(Funktion,Counter) :-
    8. arity(Funktion,Counter).
    9. self_dual(ZZ) :-
    10. check(f(1,1,0),f(0,0,0)),
    11. check(f(1,0,0),f(0,1,0)),
    12. check(f(0,1,0),f(1,0,0)),
    13. check(f(0,0,0),f(1,1,0)).
    Alles anzeigen


    Wie bekomme ich die Funktion self_dual dynamisch hin?

    Florian
  • Ich verstehe leider wieder nicht was du genau machen möchtest. In Prolog gibt es keine boolschen Variablen und auch keine boolsche Funktionen. Es gibt Fakten, die stehen in der Wissensbasis und es gibt Prädikate. Alles was man mit Prolog letzendlich macht, ist gucken ob man eine Anfrage so "hinbiegen" kann, dass sie mit dem was in der Wissenbasis steht übereinstimmt. Gelinkt Prolog das, ist die Aussage wahr, andernfalls nicht. Ein Kerninstrument welches man bei Prolog dafür benutzt ist die Unifikation.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

  • Danke, dass dur dir so viel Mühe gibst mir zu helfen. Die Sache ist wirklich verzwickt. Das ganze ist eine Aufgabe für die UNI. Ich zermatere mir deswegen schon seit Mittoch den Kopf.

    Es ist so:
    Die Aufgabe besteht aus drei Teilen.

    1. Hier sollen wir ein Prädikat monoton/1 erstellen die überpürft ob die boolean Funktion die als Argument übergeben wird monoton ist oder nicht. orginal: Define a predicat monton/1 which checks where (eigentlich if, wie es auf Nachfrage herauskam) the boolean function given as argument is montone. Dieses Problem habe ich jetzt einmal geskipped.

    2. Es soll ein Prädikat self_dual/1 definiert werden welches überpürft ob die boolean function die als Argument übergeben wird self_dual ist. Unter self dual verstehen wir folgendes: f(not(a1),not(a2),...) = not(f(a1,a2,...)).

    3. Es soll ein Prädikat adequate/1 bestimmt werden das überprüft ob die boolche Funktion die als Argument übergeben wird adequate ist.

    Ich konzentriere mich im Moment auf 2.

    Unter boolsche Funktionen verstehen wir hier folgendes:

    Quellcode

    1. f(A,B,O) :- O is A xor B
    2. arity(f,2).


    So das ist die Ausgangslage. Das bedeutet ich muss ein Prädikat was ja hier die boolsche Funktion repäsentiert als Argument an mein Prädikat self_dual übergeben (bei mit ZZ). Dann muss ich die Anzahl der Argumente herausfinden, das geht mit arity(f,X), f ist hier das Prädikat bzw. die Funktion. Z.B.: für die oben gegebene Funktion müsste ich also eine Liste erzeugen die etwa so ausschaut [[1,1],[1,0],[0,1],[0,0]]. Dann erzeuge ich eine Schleife die folgendes tut:

    sie nimmt den ersten Teil der Liste [1,1] und setzt hier den head und Tail ein also f(1,1,O). Dann mach die Schleife das Selbe mit not also f(not(1), not(1), O). Dies wird an die Funktion check übergeben und liefert in diesem Fall true zurück. Dann macht die Schelife das selbe mit dem zweiten Element der Liste also [1,0] usw. Wenn dann am Ende bei allen Ergebnissen von check true rauskommt ist das Prädikat self dual.

    Hier die vorgeschlagene Prädikate die auf montone und self_dual hin überprüft werden sollen:

    Quellcode

    1. f(A,B,0) :- 0 is A xor B.
    2. arity(f,2).
    3. g(A,0) :- 0 is 1-A.
    4. arity(g,1).
    5. h(A,B,0) :- 0 is min(A,B).
    6. arity(h,2).


    Hier nochmals mein Code:

    Quellcode

    1. % Statische Überprüfung auf self_dual von Funktion %
    2. or(A,B) :- A; B.
    3. check(A,B) :- or(not(A),B),or(A,not(B)).
    4. % Dieses Prädikat setzt alle Kombinationen der Funktionswerte der Funktion in check ein,
    5. % wenn alle Überprüfungen true ergeben, dann ist das übergebene Prädikat self_dual.
    6. self_dual(ZZ) :-
    7. arity(ZZ,X).
    8. check(f(1,1,0),f(0,0,0)),
    9. check(f(1,0,0),f(0,1,0)),
    10. check(f(0,1,0),f(1,0,0)),
    11. check(f(0,0,0),f(1,1,0)).
    Alles anzeigen


    Hier mein überarbeiteter Code bei dem ich schon versuche mit einer Liste zu arbeiten, aber was leider noch nicht geht:

    Quellcode

    1. % Statische Überprüfung auf self_dual von Funktion %
    2. or(A,B) :- A; B.
    3. check(A,B) :- or(not(A),B),or(A,not(B)).
    4. % Dieses Prädikat setzt alle Kombinationen der Funktionswerte der Funktion in check ein,
    5. % wenn alle Überprüfungen true ergeben, dann ist das übergebene Prädikat self_dual.
    6. list([]).
    7. listensplit([H|T], H, T).
    8. self_dual(ZZ) :-
    9. %arity(ZZ,X),
    10. list([[1,1],[1,0],[0,1],[0,0]]),
    11. listensplit([[1,1],[1,0],[0,1],[0,0]],Head,Rest),
    12. listensplit(Head,First,Second),
    13. check(f(First,Second,0),f(not(First),not(Second),0)),
    14. listensplit(Rest,Head,Rest),
    15. listensplit(Head,First,Second),
    16. check(f(First,Second,0),f(not(First),not(Second),0)),
    17. listensplit(Rest,Head,Rest),
    18. listensplit(Head,First,Second),
    19. check(f(First,Second,0),f(not(First),not(Second),0)),
    20. listensplit(Rest,Head,Rest),
    21. listensplit(Head,First,Second),
    22. check(f(First,Second,0),f(not(First),not(Second),0)).
    Alles anzeigen


    Im Prinzip sollte am Ende die Bedienung ähnlich ausschauen wie bei arity.

    Quellcode

    1. f(A,B,0) :- 0 is A xor B.
    2. ?- self_dual(f).
    3. true


    Die Prädikate sind adequate wenn sie sowohl self_dual sind wie auch montone.

    Nochmals danke, dass du dir soviel Mühe gibst!!!!
    Florian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von eolith421 ()

  • eolith421 schrieb:

    Danke, dass dur dir so viel Mühe gibst mir zu helfen. Die Sache ist wirklich verzwickt. Das ganze ist eine Aufgabe für die UNI. Ich zermatere mir deswegen schon seit Mittoch den Kopf.nokia lumia 735 hülle

    Es ist so:
    Die Aufgabe besteht aus drei Teilen.

    1. Hier sollen wir ein Prädikat monoton/1 erstellen die überpürft ob die boolean Funktion die als Argument übergeben wird monoton ist oder nicht. orginal: Define a predicat monton/1 which checks where (eigentlich if, wie es auf Nachfrage herauskam) the boolean function given as argument is montone. Dieses Problem habe ich jetzt einmal geskipped.

    2. Es soll ein Prädikat self_dual/1 definiert werden welches überpürft ob die boolean function die als Argument übergeben wird self_dual ist. Unter self dual verstehen wir folgendes: f(not(a1),not(a2),...) = not(f(a1,a2,...)).

    3. Es soll ein Prädikat adequate/1 bestimmt werden das überprüft ob die boolche Funktion die als Argument übergeben wird adequate ist.

    Ich konzentriere mich im Moment auf 2.

    Unter boolsche Funktionen verstehen wir hier folgendes:

    Quellcode

    1. f(A,B,O) :- O is A xor B
    2. arity(f,2).


    So das ist die Ausgangslage. Das bedeutet ich muss ein Prädikat was ja hier die boolsche Funktion repäsentiert als Argument an mein Prädikat self_dual übergeben (bei mit ZZ). Dann muss ich die Anzahl der Argumente herausfinden, das geht mit arity(f,X), f ist hier das Prädikat bzw. die Funktion. Z.B.: für die oben gegebene Funktion müsste ich also eine Liste erzeugen die etwa so ausschaut [[1,1],[1,0],[0,1],[0,0]]. Dann erzeuge ich eine Schleife die folgendes tut:

    sie nimmt den ersten Teil der Liste [1,1] und setzt hier den head und Tail ein also f(1,1,O). Dann mach die Schleife das Selbe mit not also f(not(1), not(1), O). Dies wird an die Funktion check übergeben und liefert in diesem Fall true zurück. Dann macht die Schelife das selbe mit dem zweiten Element der Liste also [1,0] usw. Wenn dann am Ende bei allen Ergebnissen von check true rauskommt ist das Prädikat self dual.

    Hier die vorgeschlagene Prädikate die auf montone und self_dual hin überprüft werden sollen:

    Quellcode

    1. f(A,B,0) :- 0 is A xor B.
    2. arity(f,2).
    3. g(A,0) :- 0 is 1-A.
    4. arity(g,1).
    5. h(A,B,0) :- 0 is min(A,B).
    6. arity(h,2).


    Hier nochmals mein Code:

    Quellcode

    1. % Statische Überprüfung auf self_dual von Funktion %
    2. or(A,B) :- A; B.
    3. check(A,B) :- or(not(A),B),or(A,not(B)).
    4. % Dieses Prädikat setzt alle Kombinationen der Funktionswerte der Funktion in check ein,
    5. % wenn alle Überprüfungen true ergeben, dann ist das übergebene Prädikat self_dual.
    6. self_dual(ZZ) :-
    7. arity(ZZ,X).
    8. check(f(1,1,0),f(0,0,0)),
    9. check(f(1,0,0),f(0,1,0)),
    10. check(f(0,1,0),f(1,0,0)),
    11. check(f(0,0,0),f(1,1,0)).
    Alles anzeigen


    Hier mein überarbeiteter Code bei dem ich schon versuche mit einer Liste zu arbeiten, aber was leider noch nicht geht:

    Quellcode

    1. % Statische Überprüfung auf self_dual von Funktion %
    2. or(A,B) :- A; B.
    3. check(A,B) :- or(not(A),B),or(A,not(B)).
    4. % Dieses Prädikat setzt alle Kombinationen der Funktionswerte der Funktion in check ein,
    5. % wenn alle Überprüfungen true ergeben, dann ist das übergebene Prädikat self_dual.
    6. list([]).
    7. listensplit([H|T], H, T).
    8. self_dual(ZZ) :-
    9. %arity(ZZ,X),
    10. list([[1,1],[1,0],[0,1],[0,0]]),
    11. listensplit([[1,1],[1,0],[0,1],[0,0]],Head,Rest),
    12. listensplit(Head,First,Second),
    13. check(f(First,Second,0),f(not(First),not(Second),0)),
    14. listensplit(Rest,Head,Rest),
    15. listensplit(Head,First,Second),
    16. check(f(First,Second,0),f(not(First),not(Second),0)),
    17. listensplit(Rest,Head,Rest),
    18. listensplit(Head,First,Second),
    19. check(f(First,Second,0),f(not(First),not(Second),0)),
    20. listensplit(Rest,Head,Rest),
    21. listensplit(Head,First,Second),
    22. check(f(First,Second,0),f(not(First),not(Second),0)).
    Alles anzeigen


    Im Prinzip sollte am Ende die Bedienung ähnlich ausschauen wie bei arity.

    Quellcode

    1. f(A,B,0) :- 0 is A xor B.
    2. ?- self_dual(f).
    3. true


    Die Prädikate sind adequate wenn sie sowohl self_dual sind wie auch montone.

    Nochmals danke, dass du dir soviel Mühe gibst!!!!
    Florian
    ICH kann nicht verstehen :(
    Wenn man für weise Worte und guten Rat taub ist, kann man sich kein hohes Ziel setzen und keinen inneren Halt finden. tasche iphone 6 plus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Saarbruecker86 ()