Wahrheitstabellen aus anonymen Funktionen in Haskell

7

Ich versuche eine Wahrheitstabelle für einen gegebenen booleschen Ausdruck zu erzeugen. Ich könnte dies mit dem Erstellen eines neuen Datentyps BoolExpr tun, aber ich möchte es mit einer anonymen Funktion tun. Es sollte so funktionieren:

%Vor%

Mein Ansatz:

%Vor%

Das funktioniert, aber nur für 2 Argumente. Ich möchte es für eine beliebige Anzahl von Argumenten tun. Also dachte ich, ich würde eine Funktion machen, die die Argumente aus einer Liste übernimmt:

%Vor%

Das funktioniert nicht:

%Vor%

Ich verstehe nicht, was das Problem hier ist. Ich wäre sehr dankbar, wenn mir jemand in die richtige Richtung zeigen oder einen Link posten könnte, der das tut.

    
1nterference 12.12.2011, 17:11
quelle

3 Antworten

4

Das Problem hier ist, dass Sie versuchen, eine Funktion rekursiv mit einem anderen Typ für den rekursiven Schritt aufzurufen. Betrachten Sie die Definition:

%Vor%

Versuchen wir, den Typ selbst abzuleiten. Wir können sofort sehen, dass das erste Argument f eine Funktion von mindestens einem Argument sein sollte, das zweite Argument (x:xs) ist eine Liste, und die Listenelemente sollten den gleichen Typ wie das erste Argument von f haben. Im ersten Fall wird das Argument f zurückgegeben, daher muss der letzte Rückgabetyp dem ersten Argument entsprechen. Also fangen wir damit an:

%Vor%

Um den unbekannten Typ ? zu finden, können wir uns den zweiten Fall ansehen, der aus einem rekursiven Aufruf besteht. Das Argument xs ist derselbe Listentyp und das Argument (f x) hat den Typ ? . Da es als erstes Argument im rekursiven Aufruf mit dem Typ (a -> ?) verwendet wird, können wir nun folgern, dass ? vom selben Typ ist wie (a -> ?) , also vom selben Typ wie (a -> (a -> ?)) , also der gleicher Typ wie (a -> (a -> (a -> ?))) , was ... oops ist.

Das wäre natürlich der "unendliche Typ".

Wenn Sie dies mit Funktionen tun möchten, die eine variable Anzahl von Argumenten eines einzigen Typs verwenden, werden Sie wahrscheinlich Funktionen verwenden wollen, die eine Liste von Werten anstelle von einzelnen Argumenten verwenden. Andernfalls müssen Sie entweder jede Version einzeln schreiben oder einige arkane Tricks mit erweiterten Sprachfunktionen verwenden, von denen keine in einem einfachen Fall wie diesem ansprechend ist.

    
C. A. McCann 12.12.2011, 17:26
quelle
13

Wenn Sie eine Wahrheitstabelle für boolesche Funktionen mit einer beliebigen Anzahl von Argumenten erstellen möchten, erstellen Sie eine Funktion, die für mehrere Typen funktionieren muss. Daher müssen Sie Klassen verwenden:

%Vor%

Zum Beispiel:

%Vor%     
Sjoerd Visscher 12.12.2011 17:59
quelle
2

Was du verlangst, ist überhaupt nicht trivial. Haskell macht es nicht einfach, mit Funktionen umzugehen, die Funktionen mit variablen Anzahlen von Argumenten anwenden. Zum Beispiel die zip-Funktionen von Data.List kommen in verschiedenen Varianten für unterschiedliche Anzahlen von Argumenten vor ( zip , zip3 , zip4 , ...). In Control.Monad gibt es liftM , liftM2 , liftM3 , ...

Grundsätzlich ist der allgemeinste Typ, den Sie einer Funktion mit einer unbekannten Anzahl von Argumenten zuweisen können, a -> b ; Eine einplatzige Wahrheitsfunktion ist Bool -> Bool (a = Bool , b = Bool ), eine zweistellige Wahrheitsfunktion ist Bool -> (Bool -> Bool) (a = Bool , b = Bool -> Bool ), drei Ort ist Bool -> (Bool -> (Bool -> Bool)) (a = Bool , b = Bool -> (Bool -> Bool) ) und so weiter. Aber es gibt keine einfache Möglichkeit, die Funktion, die Sie übergeben haben, zu betrachten, um zu wissen, welcher Typ rechts vom ursprünglichen Pfeil angezeigt wird.

Eine Art von Lösung, die zum Arbeiten gebracht werden kann, beinhaltet die Verwendung von Typklassen, um separate Instanzen der Wahrheitstabellen-Maker-Funktion für jeden Argument-Funktionstyp zu definieren. Die Antwort von Sjoerd Visscher in diesem Thread lautet für alle Funktionsgrößen mithilfe einer rekursiven Instanzdefinition (beachten Sie die rekursive TruthTable a => TruthTable (Bool -> a) -Deklaration). Es kann andere Lösungen geben, die mit der Klasse Applicative type erstellt werden können.

    
Luis Casillas 12.12.2011 19:43
quelle

Tags und Links