@Nino:
Um es nun sauber zu machen solltest du "a" schützen (ähnlich wie in Pure Basic mit Protected).
In Lizard geht das mit Scope:
Deine Korrekturen zur Dokumentation habe ich dankend zur Kenntnis genommen und werde es zeitnah korrigieren.
>
"Wie wäre es denn, wenn Lizard als Ergebnis alle 3 Lösungen zurückgeben würde: {Lösung1, Lösung2, Lösung3}?"
Der Term (-27)^(1/3) soll ja an sich keine Lösungsmenge zurückgeben, sondern so (order umgeschrieben) weiter durchgereicht werden, bis er z.B. auf ein ^3 trifft und dann wieder eine -27 umgewandelt werden kann. Die Sache mit allen Lösungen ist aber ein weiteres Fernziel, nämlich Solve(): Dann würde Solve(x==(-27)^(1/3), x) eine Liste mit allen Lösungen geben.
___________________
@CSHW89:
Ja genau da ist es ... ComplexMath ... doch schon 12 Jahre her
>
"Hast du eigentlich auch vor, analytische Funktionen bereitzustellen, also Differenzieren, Limes, Integrieren?"
Auf lange Sicht ja. Ein "Package" zum Differenzieren gibts schon, das muss dann auch garnicht "hard-coded" werden, sondern lassen sich direkt in Lizard definieren, wie zum Beispiel:
Code: Alles auswählen
Derive(f? + g?, x?Symbol) := Derive(f, x) + Derive(g, x)
Derive(f? * g?, x?Symbol) := Derive(f, x) * g + Derive(g, x) * f
Derive(f? ^ n?Integer, x?Symbol) := n * f^((-1)+n) * Derive(f, x)
Dank der guten Mustererkennung werden in Lizard so auch Terme wie f+g+h differenziert, weil Lizard alleine weiß, dass es daraus (f)+(g+h) machen darf.
Das Lizard (bis zu einem gewissen Grad) Terme zusammen fassen kann, liegt weniger an dieser Mustererkennung sondern an den besonderen Attributen wie "Flat": verschachtelte Funktionen dürfen abgeflacht werden f(x,f(y,z))=f(x,y,z); und "Orderless": Argumente dürfen sortiert werden f(a,c,a) = f(a,a,c);
Dadurch werden Terme "automatisch" so modifiziert, dass die eigentliche Funktion Plus es dann einfacher Folge-Terme ggf. zusammenzufassen.
>
"Wenn du aber schreibst "Sehr mächtige Mustervergleichs-Engine" kann ich mir durchaus vorstellen, dass das damit machbar wäre. Der Algorithmus hinter der Mustervergleichs-Engine würde mich im Übrigen wirklich sehr interessieren."
Das "Sehr" ist vllt etwas übertrieben, aber ich finde sie schon recht mächtig. Was meine ich damit? Nun, wenn für einen Ausdruck geguckt werden soll, ob es eine passende Definition gibt, so arbeitet die Engine ein bisschen wie die für Reguläre Ausdrücke. Das Muster f(x?, x?, y??) passt dann zB auf alle Funktionen f, bei denen das erste und zweite Argument exakt identisch sein muss, und danach beliebige viele (??) andere Argumente sein können. Nun kommt hinzu, dass die oben beschriebenen Attribute Flat und Orderless ebenfalls ausgenutzt werden können. Hier prüft die Engine also auch, ob die Definition vielleicht passt, wenn ich die Funktion verschachtel oder die Parameter umordne.
Wenn f z.B. Orderless ist, dann würde auch f(1,2,3,2) zum Muster passten, nämlich f(2,2,1,3).
Wenn f z.B. Flat ist, dann würde auch f(1,2,1,2,3,4) zum Muster passen, nämlich f(f(1,2), f(1,2), 3, 4).
Diese Mustervergleichs-Engine zu schreiben war schon sehr Zeit- und Nerven-raubend, dafür hat man jetzt viel mehr Flexibilität.