Wie schreibe ich einen Funktionskörper in Idris, so dass der Typ der Funktionssignatur entspricht und das Ganze kompiliert wird

8

Ich möchte dafür folgendes kompilieren:

%Vor%

Dies kann nicht kompiliert werden, da der Compiler n nicht mit n + m vereinheitlichen kann. Ich verstehe, dass dies wegen der Signatur von take für Vect ist, aber ich kann nicht herausfinden, wie man den Compiler zeigt, dass sie vereinheitlicht werden können, wenn m = 0 .

    
jedesah 24.07.2014, 17:14
quelle

2 Antworten

6

Um nur zur vorherigen Antwort hinzuzufügen, besteht eine andere Möglichkeit darin, das Inline-Schreiben mit dem vorhandenen plusZeroRightNeutral Lemma aus der Bibliothek neu zu schreiben:

%Vor%

Die Schwierigkeit, die Idris bei der Vereinheitlichung hat, ist, dass er nicht bereit ist, die m in der Anwendung von take abzuleiten:

%Vor%

Sie haben es einem Vect n String gegeben, wo es ein Vect (n + m) a wollte - es hat erfreulicherweise das a mit dem String vereinheitlicht, weil Vect ein Typkonstruktor ist, aber nicht bereit ist,% co_de zu vereinheitlichen % mit n , weil es im Allgemeinen Funktionen nicht invertieren kann. Du und ich können sagen, dass n + m Null sein muss, aber Idris ist nicht so schlau.

    
Edwin Brady 27.07.2014, 19:45
quelle
3

Idris kann n nicht mit n + m vereinheitlichen, weil es n = n + 0 nicht kennt. Sie müssen ihm helfen, indem Sie das manuell beweisen.

Zuerst, warum es diesen Beweis benötigt. Der Grund dafür ist, dass take Vect (n+m) a erwartet:

%Vor%

Also wird dies check

%Vor%

Sie benötigen eine Möglichkeit, Vect n a in Vect (n + 0) a zu konvertieren:

%Vor%

Dies ist mit replace function möglich:

%Vor%

Aber jetzt brauchst du einen Beweis, dass n = n + 0 . Hier ist es (mit dem Rest des Codes):

%Vor%

Scheint zu viel für so eine einfache Funktion. Hoffe, jemand wird eine prägnantere Lösung zeigen.

    
max taldykin 24.07.2014 21:32
quelle

Tags und Links