2016-11-22 5 views
2

sagen, dass ich einen Typ für Sätze Prop machen müssen:Folding Set ein neues Set

type Prop = 
    | P of string 
    | Disjunction of Prop * Prop 
    | Conjunction of Prop * Prop 
    | Negation of Prop 

Wo:

• A "p" representing the atom P, 
• Disjunction(A "P", A "q") representing the proposition P ∨ q. 
• Conjunction(A "P", A "q") representing the proposition P ∧ q. 
• Negation(A "P") representing the proposition ¬P. 

ich angeblich verwenden, um eine mengenbasierte Darstellung von Formeln in disjunctive normale Form. Da die Konjunktion kommutativ, assoziativ und (a ∧ a) äquivalent zu a ist, ist es zweckmäßig, ein Grundkonjunkt bc durch seinen Literalsatz litOf (bc) darzustellen.

bc ist definiert als: Ein Literal ist ein Atom oder die Negation eines Atoms und ein basisches conjunct eine Konjunktion von Literalen

Dies führt mich an die Funktion für litOf: I

let litOf bc = 
    Set.fold (fun acc (Con(x, y)) -> Set.add (x, y) acc) Set.empty bc 

bin ziemlich sicher, dass mein litOf falsch ist, und ich bekomme einen Fehler auf dem (Con(x,y)) Teil sagen: "Unvollständiges Muster m atches auf diesem Ausdruck. Zum Beispiel kann der Wert 'Dis (_, _)' eine cas e nicht anzeigen von den Mustern bedeckt. ", was ich auch nicht weiß was bedeutet eigentlich in diesem Zusammenhang.

Irgendwelche Hinweise, wie ich fortfahren kann?

+0

nicht sicher, ob ich verstehe alles hier, aber Spaß acc (Con (x, y erhalten)) ist wahrscheinlich ein Spielausdruck, wie ich es gelesen habe, und als solche vermisst du den Rest des "Matching" (von den Gewerkschaften). Es würde natürlich sehr helfen om der Code war hier in einem "laufenden" Zustand: [MCVE] http://stackoverflow.com/help/mcve –

+1

Ein Beispiel für funktionierende und getestete Code zum Erstellen von DNF in F # kann sein gefunden [hier] (https://github.com/jack-pappas/fsharp-logic-examples/blob/master/FSharpx.Books.AutomatedReasoning/prop.fs#L407). Dies hat viel mehr Details, als Sie fragen, dauert Tage, um alles zu verstehen, da es auch Parsing und hübsches Drucken beinhaltet. Auch sollten Sie das Buch bekommen, um es wirklich zu verstehen. Daher ist es ein Kommentar. Es gibt [Beispiele] (https://github.com/jack-pappas/fsharp-logic-examples/blob/master/Examples/prop.fsx) für die Verwendung mit einer REPL –

Antwort

3

Ich gehe davon aus Ihrem Prop Beispiel Typ auf dem Weg von Tastatur hier geändert, und sah orginally wie folgt aus:

type Prop = 
    | P of string 
    | Dis of Prop * Prop 
    | Con of Prop * Prop 
    | Neg of Prop 

Es gibt mehrere Dinge, die Sie nach oben ausgelöst:

  • Set. falten operiert auf Eingabe, die eine Menge ist, und tut etwas für jedes Element in der Menge. In Ihrem Fall ist die Eingabe eine boolesche Klausel, und die Ausgabe ist eine Menge.

  • Sie haben nicht vollständig definiert, was ein Literal ausmacht. Für eine Konjunktion ist die Menge der Literale die Vereinigung der Literale auf der linken und auf der rechten Seite. Aber was ist mit einer Disjunktion? Die Compiler-Fehlermeldung bedeutet genau das.

Hier ist, was ich denke, Sie sind nach:

let rec literals = function 
    | P s -> Set.singleton s 
    | Dis (x, y) -> Set.union (literals x) (literals y) 
    | Con (x, y) -> Set.union (literals x) (literals y) 
    | Neg x -> literals x 

Damit werden Sie

> literals (Dis (P "A", Neg (Con (P "B", Con (P "A", P "C"))))) 
val it : Set<string> = set ["A"; "B"; "C"] 
+0

In [DNF] (http: // mathworld .wolfram.com/DisjunctiveNormalForm.html), kann man nichts negativeres als eine [Variable] (https://en.wikipedia.org/wiki/Disjunctive_normal_form) – kaefer

+0

@kaefer: Das ist wahr, aber außerhalb des Umfangs der Frage. –