Elektronik-Bastler stehen oft vor dem Problem, eine Logik, die ihnen vorschwebt, in Hardware zu realisieren. Oft fehlt es an mathematischen Kenntnissen und Verfahren. Tools gibt eine ganze Reihe, die das mehr oder weniger gut erleichtern können. Hier herrscht leider eine Vielfalt der Darstellung/Schreibweise. Ich habe deshalb das Tool LogicBuddy geschrieben, dass es Anfängern und Bastlern erleichtern soll, logische Funktionen in eine realisierbare Form zu bringen. Im wesentlichen werden Ausdrücke mit NAND und NOT erzeugt. Eingeben kann man sowohl eine Wahrheitstabelle - mit Klicki-Micki, als auch Ausdrücke mit 'and', 'or' usw. Es werden sowohl logische Ausdrücke wie x = ( a and b ) or ( not a and not b ) . # englisch x = ( a und b ) oder ( nicht a und nicht b ) . # deutsch y = NAND( NAND( NOT a, b ), x ). als auch einfache Sätze wie x ist wahr wenn a und b. x ist wahr wenn a und nicht b. y = NAND( NAND( NOT a, b ), x ). akzeptiert. LogicBuddy gibt es in drei Versionen 1. Quellcode, 2. lauffähige Version für Linux und 3. lauffähiges Paket für Windows. unter http://praktische-elektronik.dr-k.de/Tools/InstallationLogicBuddy.html Die beiden lauffähigen Versionen benötigen keine umfangreiche Installation und können leicht wieder entfernt werden. Sie laufen auch von externen Medien wie USB-Sticks. LogicBuddy ist in Perl geschrieben, verwendet und enthält das Tool espresso. Ich habe das Programm unter verschiedenen Linux-Versionen und Windows getestet, brauche aber Eure Hilfe für weitere Tests. Und natürlich brauche ich Anregungen und Kritik für das Tool selbst. U.a. brauche ich Klärung zu folgenden Aussagen: Eingang sind a und b. x ist wahr wenn a und b. Ausgang ist x. Welchen Wert hat x in anderen Fällen: FALSCH oder UNDEFINIERT oder ? Grüße Heiner
:
Verschoben durch User
Ähm, sorry, was macht das Teil? Ich meine außer Fehlermeldungen?
Hallo Heiner, ich habe dein Tool zwar noch nicht getestet, aber zumindest von der Screenshots und von der Sache her macht es schon mal einen guten Eindruck. :) Heiner K. schrieb: > U.a. brauche ich Klärung zu folgenden Aussagen: > > Eingang sind a und b. > x ist wahr wenn a und b. > Ausgang ist x. > > Welchen Wert hat x in anderen Fällen: FALSCH oder UNDEFINIERT oder ? Äähm, vielleicht verstehe ich diese trivial anmutende Frage nicht richtig, aber ich würde sagen - aus dieser umgangssprachlichen Definition geht einfach nicht hervor welchen Wert x in dem Fall hat. Das ist möglicherweise (irgendwo in den Tiefen deines Programms) definiert, mir ist es jedoch unbekannt. - als geneigter Leser und pragmatischer Techniker würde ich jedoch von binärer Logik ausgehen und "x ist wahr wenn a und b" als "x = a & b;" interpretieren. Demzufolge erwarte ich ein FALSCH als Antwort. Und nichts anderes. - ansonsten stellt sich die Frage welche Logik dein Tool anwendet (da gäbe es ja noch mehrwertige Logik und nichtmonotone Logik und all das Zeug) - ehrlich gesagt würde ich das Problem aber wohl dadurch lösen das ich die Möglichkeit "umgangssprachlichen Definitionen" einzugeben aus dem Programm entfernte. Ich glaube nicht das sie in der Praxis großartig verwendet werden wird.
Hollo Guido Guido B. schrieb: > Ähm, sorry, > > was macht das Teil? Ich meine außer Fehlermeldungen? Wie der Titel sagt: Logiken minimieren Ein logischer Ausdruck wie x=(a und nicht b) oder ( (nicht a und c) oder b ) und (b oder nicht c). wird zu x = NAND ( NOT(a), NOT(b) ). vereinfacht. Der erste Ausdruck braucht 3 AND-Gatter, 3 OR-Gatter und 3 Inverter. Der zweite nur ein NAND und 2 Inverter :) Es geht auch mit 1 OR-Gatter: x = a OR b. Beides liefert das Teil. Der Text für die Ausdrücke kann frei eingegeben werden. Fehler nicht nur zu erkennen sondern auch Vorschläge für die Behebung zu machen, sollen den Anwender unterstützen. Dazu ist zu klären, was Eingänge und was Ausgänge sind. Man kann übrigens auch Wahrheitstabellen einsetzen und zwischen der Text und Wahrheitstabelle per Klick hin und her transferieren und natürlich beide ändern.
Besucher schrieb: > Heiner K. schrieb: >> U.a. brauche ich Klärung zu folgenden Aussagen: >> >> Eingang sind a und b. >> x ist wahr wenn a und b. >> Ausgang ist x. >> >> Welchen Wert hat x in anderen Fällen: FALSCH oder UNDEFINIERT oder ? > > Äähm, vielleicht verstehe ich diese trivial anmutende Frage nicht > richtig, aber ich würde sagen > - aus dieser umgangssprachlichen Definition geht einfach nicht hervor > welchen Wert x in dem Fall hat. Das ist möglicherweise (irgendwo in den > Tiefen deines Programms) definiert, mir ist es jedoch unbekannt. Das war der Sinne meiner Frage. Eigentlich geht es nur um das WENN. ist, und, oder nicht sind nur syntaktischer Zucker für = AND OR > - als geneigter Leser und pragmatischer Techniker würde ich jedoch von > binärer Logik ausgehen und "x ist wahr wenn a und b" als "x = a & b;" > interpretieren. Demzufolge erwarte ich ein FALSCH als Antwort. Und > nichts anderes. Natürlich binäre Logik. x ist wahr wenn a AND b. 1. Der letzte Ausdruck überschreibt vorherige. 2. WENN setzt die Ausgangs-Variable x nur dann, falls der Ausdruck hinter dem WENN (a AND b) WAHR ist. Aber welchen Wert hat x, für den Fall, dass (a AND b) FALSCH ist. Dann wird x nicht gesetzt. Das Programm geht davon aus, dass x initial FALSCH ist. > - ansonsten stellt sich die Frage welche Logik dein Tool anwendet (da > gäbe es ja noch mehrwertige Logik und nichtmonotone Logik und all das > Zeug) Natürlich nur binäre. > - ehrlich gesagt würde ich das Problem aber wohl dadurch lösen das ich > die Möglichkeit "umgangssprachlichen Definitionen" einzugeben aus dem > Programm entfernte. Ich glaube nicht das sie in der Praxis großartig > verwendet werden wird. Ja. Das WENN soll Anfänger unterstützen, die sich mit der Formulierung normaler Ausdrücke schwer tun.
alter Verwalter, die entpackte Windows-Version hat knappe 500MB ist da gleich der 20-Band-Brockhaus mit drin??? kann man das nicht etwas schlanker gestalten?
:
Bearbeitet durch User
Heiner K. schrieb: > x ist wahr wenn a AND b. > > 1. Der letzte Ausdruck überschreibt vorherige. > > 2. WENN setzt die Ausgangs-Variable x nur dann, falls der Ausdruck > hinter dem WENN (a AND b) WAHR ist. > > Aber welchen Wert hat x, für den Fall, dass (a AND b) FALSCH ist. Dann > wird x nicht gesetzt. Das Programm geht davon aus, dass x initial FALSCH > ist. Also ist damit sowas wie
1 | if( a & b ) { |
2 | x = true; |
3 | }
|
gemeint? Dann wäre es freilich auch klar - x behält seinen bisherigen Wert. Nur bei der Abbildung der Umgangssprache auf dieses Konstrukt hat's (bei mir) gehakt. Da hätte ich wohl das Handbuch lesen sollen.. 8-)
Mike B. schrieb: > alter Verwalter, die entpackte Windows-Version hat knappe 500MB > ist da gleich der 20-Band-Brockhaus mit drin??? > > kann man das nicht etwas schlanker gestalten? Leute wie du sind der Grund, warum ich meine Projekte hier nicht vorstelle. Freu dich doch lieber, dass du einen kompletten C++Compiler kostenlos mit dazu bekommen hast. Das sind Sachen, die man immer gebrauchen kann. Aber nein, es muss ja immer an allem rumgemeckert werden.
Heiner K. schrieb: > Guido B. schrieb: >> Ähm, sorry, >> >> was macht das Teil? Ich meine außer Fehlermeldungen? > > Wie der Titel sagt: Logiken minimieren Ah, danke! Wer lesen kann ist klar im Vorteil. :-/
Undankbare Meckertante schrieb: > Mike B. schrieb: >> alter Verwalter, die entpackte Windows-Version hat knappe 500MB >> ist da gleich der 20-Band-Brockhaus mit drin??? >> >> kann man das nicht etwas schlanker gestalten? > > Leute wie du sind der Grund, warum ich meine Projekte hier nicht > vorstelle. Freu dich doch lieber, dass du einen kompletten C++Compiler > kostenlos mit dazu bekommen hast. Das sind Sachen, die man immer > gebrauchen kann. Aber nein, es muss ja immer an allem rumgemeckert > werden. sollte kein meckern sein, sorry wollte nur freundlich fragen was braucht man um den Quellcode zu bearbeiten? welche perl-umgebung, version, was auch immer
Besucher schrieb: > Heiner K. schrieb: >> x ist wahr wenn a AND b. >> > Also ist damit sowas wie > [c] > if( a & b ) { > x = true; > } Ja genau. Aber dieses muss für den Anwender klar sein. Werde ich in die Hilfe einbauen. Aus dieser soll dann eine HTML-Doku generierte werden. Ein wenig zur Realisierung: Eigentlich wird der Text der logischen Funktion mit einem einfachen rekursiv entscheidenden Parser analysiert. Der Codegenerator ersetzt einfach AND oder UND durch Perls && sowie OR oder ODER durch || usw. Bei WENN oder IF ist es ebenfalls einfach Perl kennt ein abschliessendes if. Der Perl-Code ist einfach my $x = 1 if $a && $b; der wird dann evaluiert und mit den möglichen Kombinationen von $a und $b die Wahrheitstabelle gefüllt. Die logische Funktion wird im Perl-Modul LogicBuddy/Logic.pm ausgewertet. Um den Parser zu verstehen ist die Syntax der logischen Funktionen nötig. Sie steht in $C_syntax_full. Die nicht terminalen Symbole sind als Methoden beginnend mit LOGIC zu finden.
Heiner K. schrieb: > Elektronik-Bastler stehen oft vor dem Problem, eine Logik, die ihnen > vorschwebt, in Hardware zu realisieren. [...] > Im wesentlichen werden Ausdrücke mit NAND und NOT erzeugt. Das Espresso kommt anscheined aus der Chip-Design-Ecke, wo die Beschränkung auf NAND und NOT sinnvoll ist. Aber als Bastler habe ich auch andere Gatter herumliegen, und interessiere mich nicht dafür, wie viele Transistoren intern verwendet werden. (Und ich habe hier gerade eine Schaltung mit einen Open-Collector-Ausgang. Das nenne ich aber nicht mehr "logische Funktion". ;-) > Eingang sind a und b. > x ist wahr wenn a und b. > Ausgang ist x. > > Welchen Wert hat x in anderen Fällen: FALSCH oder UNDEFINIERT oder ? Mathematisch gesehen, ist x undefiniert; man müsste "x ist nur dann wahr ..." schreiben. Umgangssprachlich kann man dieses "nur dann" weglassen. Wenn die logische Funktion nur 1-Fälle definiert (oder nur 0-Fälle), wäre es nützlich, für die restlichen Kombinationen der Eingänge den umgekehrten Fall annehmen zu können.
Heiner K. schrieb: > Eingang sind a und b. > x ist wahr wenn a und b. > Ausgang ist x. > > Welchen Wert hat x in anderen Fällen: FALSCH oder UNDEFINIERT oder ? Hmm, irgendwie ist diese Umschreibung der Funktionalität nicht ganz rund. Das klingt für mich als handele es sich um die Beschreibung eines Gatters mit zwei Eingängen und einem Ausgang. Ein solches Gatter könnte zwar WAHR oder FALSCH ausgeben; solange es jedoch keinen Eingang für ein x hat kann es auch kein unverändertes x wieder ausgeben (vielleicht mittels Tristate, aber das war ja hier glaube ich nicht gemeint). Am einfachsten wäre es wohl die Beschreibung entsprechend zu erweitern: Eingang sind a, b und x. x ist wahr wenn a und b x bleibt unverändert wenn nicht a und b Ausgang ist x.
Mike B. schrieb: > was braucht man um den Quellcode zu bearbeiten? > welche perl-umgebung, version, was auch immer Unter Linux ist Perl dabei. Unter Windows kann ich nur Strawberry-Perl empfehlen. Die Quellversion auspacken und in das Verzeichnis LogicBuddy_yyyy_mmm_dd gehen dort perl LogicBuddy/LogicBuddy.pl Dann wird von Perl angemault, was fehlt. Ein Paket (z.B. Readonly) wird in der Kommadozeile mit cpan -i Readonly installiert. Bei manchen Paketen kann das dauern ... Ich habe z.Z. nicht parat, welche Pakete fehlen. Spontan fallen mit Tk, Readonly, Safe, Data::DumperFile ein. Perl Programmierer kennen kennen sich damit aus. Um diese Prozedur allen anderen zu ersparen, habe ich die fertigen Pakete angeboten. Für Windows werde ich Update-Pakte anbieten, die dann viel kleiner sind :)
Hallo, ich danke allen, die sich zu der Formulierung der logischen Funktionen geäussert haben. Ich werde darüber nachdenken und das Ganze später hier vorstellen. Grüsse Heiner
Hallo zusammen, ich habe versucht, die Struktur der Formulierung logischer Funktionen etwas klarer zu fassen. Eigentlich geht es nur um die Formulierung mit WENN. Es gibt das Problem des Werts falls WENN nicht zutrifft: Entweder ist der Wert der Variablen bereits definiert oder er wird initial auf FALSCH gesetzt. Das WENN kann auch dazu verwendet werden, anzugeben in welchen Fällen der Wert der Variablen nicht definiert bzw. beliebig ist. Das entspricht dem 'd' in Wahrheitstabellen. Damit es zu keinen Missverständnissen kommt, darf ein solcher Ausdruck nur am Ende der Liste der Ausdrücke stehen. Ein Beispiel: Eingang = a, c, d. x = a und b. # Kommentar bis zum Ende der Zeile y = c oder d. v = wahr wenn d und nicht a. z = y und ( nicht a oder nicht c ). x = beliebig wenn nicht c. Ausgang = x, z. Ein paar Regeln Eine spätere Aussage geht über eine vorherige. Bei WENN erhält die Variable nur dann den Wert, wenn die Aussage hinter WENN zutrifft. Jede Variable hat den anfänglichen Wert FALSCH. Aussagen mit BELIEBIG dürfen nur unmittelbar vor AUSGANG stehen. Eine Kurzfassung seht unter http://praktische-elektronik.dr-k.de/Tools/LogicBuddy-Kurzfassung-logische-Funktionen.html Ich hoffe, dass damit logische Funktionen besser beschrieben sind. Die Beschreibung von LogicBuddy, eine Zusammenfassung der integrierten Hilfen steht unter http://praktische-elektronik.dr-k.de/Tools/LogicBuddy-Dokumentation.html Grüße Heiner
Sowas haben wir im Studium in Prolog als Übung geschrieben, oder ein CAS-System für Ableitungsregeln,.... Geht in Prolog sehr einfach. Das ganze per swi-lib an ein C-Programm geklatscht hat das nur ein paar kb, ok ohne GUI aber das Tk-Zeug kann man auch noch ranflicken wenn man das haben will oder macht es als Webanwendung.... Dein Monstrum ist eher zum abgewöhnen und dann kanns auch nur NAND/NOR, unbrauchbarer Schrott. Aber trotzdem ein Fleisssternchen weil du das gemacht hast.
WebDepp schrieb: > Sowas haben wir im Studium in Prolog als Übung geschrieben, oder > ein > CAS-System für Ableitungsregeln,.... Geht in Prolog sehr einfach. Das > ganze per swi-lib an ein C-Programm geklatscht hat das nur ein paar kb, > ok ohne GUI aber das Tk-Zeug kann man auch noch ranflicken wenn man das > haben will oder macht es als Webanwendung.... > > Dein Monstrum ist eher zum abgewöhnen und dann kanns auch nur NAND/NOR, > unbrauchbarer Schrott. Aber trotzdem ein Fleisssternchen weil du das > gemacht hast. Hast du vom dem Prolog-Teil noch Quellcode vorliegen? Würde mich zu Studienzwecken brennend interessieren. Prolog find ich schon spannend.
WebDepp schrieb: > Sowas haben wir im Studium in Prolog als Übung geschrieben, oder ein > CAS-System für Ableitungsregeln,.... Geht in Prolog sehr einfach. Das > ganze per swi-lib an ein C-Programm geklatscht hat das nur ein paar kb, In Prolog sind Ableitungsregeln tatsächlich ein paar Zeilen, aber unser WebDepp scheint über ein paar Zeilen aus ein einem Lehrbuch zu kopieren nicht hinaus gekommen zu sein. Sonst wüsste er, dass die Behandlung von Fehlern auch in Prolog nicht mal eben geht. > ok ohne GUI aber das Tk-Zeug kann man auch noch ranflicken wenn man das > haben will oder macht es als Webanwendung.... Und WebDepp wüsste auch, dass mal eben ranflicken einer GUI dann doch aufwendiger ist, als er zunächst vermutete. > Dein Monstrum ist eher zum abgewöhnen und dann kanns auch nur NAND/NOR, > unbrauchbarer Schrott. Aber trotzdem ein Fleisssternchen weil du das > gemacht hast. Es geht hier nicht um simples NAND/NOR für Leute, die sowieso alles besser können aber nicht machen, sondern es geht um eine Umgebung, für Anfänger und Laien, die logische Funktionen, Wahrheitstabellen und deren Vereinfachung zusammenfasst. An dieser Stelle habe ich, darum gebeten, ob die Formulierungen für Laien verständlich sind und mir erhofft, dass jemand mit genügend Fachverstand sich das einmal ansieht. Übrigens kenne ich dieses "mal eben" zur Genüge und ich bin/war dankbar dafür, weil diese Genies mir Jobs verschaffen, Schrott brauchbar zumachen. @Mike Die Ableitungsregeln in Prolog stehen in jedem Lehrbuch von Prolog. Sie funktionieren auch korrekt. Leider ist das Ergebnis nicht lesbar. Ein Mathe-Lehrer würde das nicht einmal annehmen. Ich habe in Prolog Programme geschrieben, die abgeleitete Ausdrücke etwas vereinfachen. Und dieses ist ein erheblicher Aufwand von vielen Zeilen Prolog. So viel zu mal eben ...
Ohne Wertung zum Programm selber, überlege ich doch gerade, wann ich in den letzten Jahren mal Bedarf für so ein Tool gehabt hätte. Grob geschätzt gar nicht. Aber wers brauchen kann, warum nicht. Oliver
Stimmt du hast recht, ein Minimierer ist aufwendiger, habe gerade nochmal in den alten Unterlagen gekramt. Das was wir damals gemacht hatten war stark eingeschränkt. Zur Lesbarkeit: Prolog dient ja nur dazu den Term zu minimieren, wenn man das dann 'in schön' haben will parst man das nochmal extra oder schreibt sich in Prolog eine entspr. Ausgabefunktion. In modernen Prolog gibts auch print, usw. die Ausgabe im gewünschten Format ist kein Problem.
@WebDepp Du liegst daneben. Minimiert wird mit espresso. Ein Kommandozeilen-Interface ist mit ein paar Zeilen Perl geschrieben. Damit kommt aber ein Laie, nicht zurecht. Im Prinzip ist LogicBuddy eine GUI um espresso. Sie verbindet Wahrheitstabellen mit logischen Ausdrücken. Die logischen Ausrücke sollen einfach formuliert werden können. Damit sollen diejenigen unterstützt werden, die sich mit mathematischen Formulierungen schwer tun. Es wird eine Verbindung zwischen der Formulierung logischer Ausdrücke, Wahrheitstabellen, der Lösung über espresso und dem Ergebnis in einer Form, die einfach realisierbar ist, angeboten und das Ganze in alle Richtungen. In Teilen gibt es das im Web. Leider sind sie meistens nicht miteinander kompatibel, manche unausgegorene Mach-Mal-Eben-Studenten-Projekte. Bei der Formulierung der logischen Ausdrücke kann es zu Irrtümern und Fehlern kommen, deren sinnvolle Behandlung ist eben nicht simpel. Ich habe tatsächlich überlegt, das mit Prolog zu machen, es aber verworfen, weil die Fehlerbehandlung im Wesentlichen imperativ ist und ein rekursiv entscheidender Parser ziemlich geradeaus formuliert werden kann. Eine hilfreiche Fehlerbehandlung ist der größte Aufwand, etwa 80%. Wenn ich den Code in einem Jahr noch mal eben schnell anpassen will, dann ist es erforderlich, etwas ausführlicher und klarer zu schreiben. Das braucht ein paar Bytes mehr als mal eben.
Bekannt. Läuft nur unter Windows. Kennt nur * + ´ Notation. Fehlermeldung wie: Parse Error ...
Heiner K. schrieb: > Kennt nur * + ´ Notation. Ist doch ausreichend > Fehlermeldung wie: Parse Error ... Hatte ich nie. Bin gespannt welche kryptischen Fehlermeldungen dieses Programm zu bieten hat :D
Komm, also so einen Mist brauchst du hier schon mal gleich gar nicht zu empfehlen!
1 | bash: ./lf114_setup.exe: cannot execute binary file: Exec format error |
Im Gegensatz dazu funktioniert das Programm von Heiner wenigstens.
Man könnte sich aber auch eine CPLD-IDE runterladen, z.B. WinCUPL und dann den optimierten Output ansehen. Neben Logikeingabe oder Wahrheitstabelle kann man damit auch beliebige Zählweisen (Sequencer) realisieren. Ich habe aber auch schon mehrere Logik-ICs durch einen MC (ATmega48) ersetzt. Man ist damit sehr flexibel und oftmals braucht man keine Reaktionszeiten im MHz-Bereich. Man kann dann bequem in C programmieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.