[gelöst] Probleme mit Ausgabetyp boolean bei einer Funktion

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

kondi
Beiträge: 8
Registriert: Sa, 02.01.2016 22:40

[gelöst] Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von kondi »

Hallo zusammen,

vorweg: Ich benutze LibreOffice 5 unter Linux Mint Mate 17.3 64 Bit. Ich habe Programmiererfahrung, aber dies ist mein erster Versuch mit LibreOffice Basic. Ich entschuldige mich auch für den langen Beitrag; ich habe mich bemüht, mein Problem so genau und verständlich wie möglich zu schildern.

Jetzt zu meinem Problem: Ich muss öfter mal längere aussagenlogische Formeln auswerten und möchte dazu LibreOffice Calc benutzen.
Ein Beispiel: Gesucht ist die Wahrheitswertetabelle der Formel
Bild
(in Worten: (aus a folgt b) genau dann wenn (aus nicht b folgt nicht a))

Diese Formel schreibe ich in Calc so, dass jeder Buchstabe und jedes Zeichen, das ausgewertet werden muss, in einer eigenen Spalte steht. Unter jeden Buchstaben trage ich alle Kombinationen der Wahrheitswerte ein, die möglich sind, das sieht dann so aus:

Bild

Dann beginne ich mit der Auswertung, indem ich unter jedes Zeichen (in der Reihenfolge, die die Struktur der logischen Formel für die Auswertung vorschreibt) eine passende Formel eintrage und dann in die drei darunterliegenden Zeilen kopiere. Z.B. benutze ich für das 'nicht' in Spalte 8 die logische Funktion NICHT von LibreOffice.

Für die Junktoren 'nicht', 'und' und 'oder' stellt LibreOffice logische Funktionen zur Verfügung, für das Konditional ('daraus folgt', einfacher Pfeil) und das Bikonditional ('genau dann wenn', Doppelpfeil) aber nicht. Deshalb wollte ich mir dafür selbst je eine Funktion schreiben.

Bild

Deshalb habe ich diese Funktion für das Konditional geschrieben:

Code: Alles auswählen

function implikation (a as boolean, b as boolean) as boolean
  implikation = not (a and not b)
end function
und diese Funktion für das Bikonditional:

Code: Alles auswählen

function aequivalenz (a as boolean, b as boolean) as boolean
  aequivalenz = implikation (a, b) and implikation (b, a)
end function
Angewendet auf die Formel von oben sieht das Ergebnis dann so aus:

Bild
Dabei bin ich so vorgegangen:

1. Auswertung des Konditionals in Spalte 2; dazu habe ich meine Funktion implikation benutzt; Eingabe: die Werte von a und b aus Spalte 1 und Spalte 3.

2. Auswertung der beiden Verneinungen in Spalte 5 und Spalte 8 mit der logischen Funktion NICHT von LibreOffice; Eingabe: die Werte von b aus Spalte 6 bzw. von a aus Spalte 9.

3. Auswertung des Konditionals in Spalte 7 mit meiner Funktion implikation; Eingabe: die Werte der beiden Negationen aus Spalte 5 und Spalte 8.

4. Auswertung des Bikonditionals in Spalte 4 mit meiner Funktion implikation; Eingabe: die Werte des Konditionals aus Spalte 2 und die Werte des Konditionals aus Spalte 7.

Wie ihr seht, werden die Werte der Funktionen, die ich selbst geschrieben habe, auf Englisch ausgegeben, die Werte der logischen Funktion NICHT von LibreOffice dagegen auf Deutsch. Etwas irritierend, aber die Werte sind immerhin korrekt.

Wenn ich jetzt aber das Bikonditional in Spalte 4 durch ein logisches 'und' ersetze, sieht das Ergebnis so aus:

Bild

Bei der Auswertung bin ich so vorgegangen wie beim vorigen Beispiel, nur habe ich in Schritt 4 für die Auswertung der 4. Spalte die logische Funktion UND von LibreOffice benutzt. Wenn ich zur Auswertung von Spalte 4 statt der logischen Funktion UND von LibreOffice folgende selbst geschriebene Funktion und1 benutze,

Code: Alles auswählen

function und1 (a as boolean, b as boolean) as boolean
  und1 = a and b
end function
dann bekomme ich für Spalte 4 korrekte Werte, aber auf Englisch.

Offenbar sind die logischen Funktionen von LibreOffice mit den Werten der von mir selbst geschriebenen Funktionen nicht kompatibel, aber warum? Was habe ich falsch gemacht?

Ich bedanke mich bei allen, die sich die Mühe gemacht haben, meine Frage bis zum Ende zu lesen.
MfG, kondi
Zuletzt geändert von kondi am Mo, 04.01.2016 01:08, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von F3K Total »

Hi,
durch try&error habe ich herausgefunden, dass Calc besser mit Zahlen umgehen kann (WAHR = 1, FALSCH = 0), bei mir funktioniert:

function und1 (a as boolean, b as boolean) as integer
BOOLEAN_TEST.PNG
BOOLEAN_TEST.PNG (5.59 KiB) 7739 mal betrachtet
Gruß R
kondi
Beiträge: 8
Registriert: Sa, 02.01.2016 22:40

Re: Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von kondi »

Hallo F3K,

danke für deine Antwort. Ich habe daraufhin auch ein bisschen experimentiert. Wenn ich diese Funktion:

Code: Alles auswählen

function implikation2 (a as boolean, b as boolean) as integer
  if (a and not b) then
    implikation2 = 0
  else
    implikation2 = 1
  end if
end function
in Spalte 2 und Spalte 7 anwende, lässt sich nachher die logische Funktion UND von LibreOffice auf die Ergebnisse in diesen beiden Spalten ohne Fehlermeldung anwenden. Das ist allerdings sehr merkwürdig, dass dieser Typen-Mischmasch besser funktioniert, als eine Funktion, die nur den Typ 'boolean' verwendet. Kann jemand etwas dazu sagen?

MfG, kondi
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von F3K Total »

kondi hat geschrieben:Kann jemand etwas dazu sagen?
Ich nicht, aber eine Frage habe ich:
Kannst Du nun
kondi hat geschrieben:... längere aussagenlogische Formeln ...
mit Calc auswerten, oder willst du Erbsenzählen?
Wenn ich dich richtig verstanden habe, geht es um zwei bis drei functions, in die du nun statt Boolean, Integer schreiben mußt und gut.
Es steht dir natürlich frei, den Fehler im LO-Bugzilla offiziell zu melden, hier wirst du auf keinen Fall eine Änderung im Programm bewirken, es handelt sich um ein ANWENDERFORUM.
R
kondi
Beiträge: 8
Registriert: Sa, 02.01.2016 22:40

Re: Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von kondi »

Hallo F3K,

ich will

1. längere aussagenlogische Formeln auswerten, was jetzt auch gut funktioniert. Ich habe mir vorhin einen Satz eigene Funktionen für jeden Junktor geschrieben und sie gerade ausführlich getestet, sie sind praxistauglich. :D

2. verstehen, wie LibreOffice Basic mit Variablen umgeht. Es ist, wie gesagt, mein allererster Versuch in dieser Sprache, da ist es halt irritierend, wenn man gleich auf ein solches Problem stößt. Es handelt sich also offenbar um einen Bug, aber es könnte ja auch sein, dass ich als blutige Anfängerin in dieser Sprache einen Anfängerfehler gemacht und übersehen habe. Manche Programmiersprachen sind ja sehr streng mit Variablendeklarationen, andere eher großzügig, was beides seine Vor- und Nachteile hat; LibreOffice gehört wohl eher zu den Großzügigen. Übrigens gehört Erbsenzählen manchmal zum Programmieren einfach dazu.

MfG, kondi
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von F3K Total »

:D Hallo Kondi,
wie ich immer wieder lese, nehmen echte Programmierer Basic als Programmiersprache nicht ernst. Du weißt, dass du in OpenOffice/LibreOffice auch Python, Javascript, Beanshell, C++ verwenden kannst? Vielleicht geht es damit besser?
Gruß R
kondi
Beiträge: 8
Registriert: Sa, 02.01.2016 22:40

Re: Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von kondi »

Hallo F3K,
F3K Total hat geschrieben: wie ich immer wieder lese, nehmen echte Programmierer Basic als Programmiersprache nicht ernst.
Ich schon. Ich denke, es hängt vom zu lösenden Problem ab, welche Programmiersprache sich besonders dafür eignet.
F3K Total hat geschrieben: Du weißt, dass du in OpenOffice/LibreOffice auch Python, Javascript, Beanshell, C++ verwenden kannst? Vielleicht geht es damit besser?
Nein, das wusste ich nicht. Danke für den Hinweis. Jetzt suche ich noch danach, wie ich den Thread auf gelöst stellen kann, und dann ab ins Bett.

Eine gute Nacht für dich, kondi
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: [gelöst] Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von Karolus »

Hallo

Merkwürdig ist vor allem das an der Schnittstelle Basic → Calc boolean zu Text ( "True" , "False" ) konvertiert wird, womit dann ein deutsch lokalisiertes Calc nicht mal einen Wert draus machen kann ( das ist für mein Verständniss ein Bug )

In der anderen Richtung ist das Verhalten grenzwertig grosszügig, wenn einfach mal literaler Text ( "True", "False" ) zu bool-Werten konvertiert wird.
( in python wird jeder Text mit Ausnahme von "" zu `True` ausgewertet )

@kondi: In Calc gibts auch noch XODER() (exklusives oder )
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
kondi
Beiträge: 8
Registriert: Sa, 02.01.2016 22:40

Re: [gelöst] Probleme mit Ausgabetyp boolean bei einer Funktion

Beitrag von kondi »

Hallo Karolus,

auch ein Pinguin-Fan? :D
Karolus hat geschrieben: Merkwürdig ist vor allem das an der Schnittstelle Basic → Calc boolean zu Text ( "True" , "False" ) konvertiert wird, womit dann ein deutsch lokalisiertes Calc nicht mal einen Wert draus machen kann ( das ist für mein Verständniss ein Bug )
Ist wohl so. Aber jetzt weiß ich es und kann ihn umgehen.
Karolus hat geschrieben:@kondi: In Calc gibts auch noch XODER() (exklusives oder )
Ja, das könnte ich mit einem 'nicht' davor zum Bikonditional machen. Und das Konditional lässt sich aus vorhandenen Funktionen von Libreoffice auch erzeugen ( NICHT(UND(zelle1;NICHT(zelle2))) ), aber das ist so umständlich, deshalb wollte ich dafür je eine eigene Funktion mit einem möglichst kurzen Namen (und als Ausgabe lieber Nullen und Einsen als 'WAHR' und 'FALSCH').

Ich stelle mal meinen Satz von Funktionen, die ich jetzt benutze und die sich in der Praxis bereits bewährt haben, hier rein, falls sie jemand brauchen kann, der auch a.l. Formeln auswerten muss:

Code: Alles auswählen

function no (a as boolean) as integer
rem Negation
  if a then
    no = 0
  else
    no = 1
  end if
end function

function u (a as boolean, b as boolean) as integer
rem Konjunktion (logisches und)
  if (a and b) then
    u = 1
  else
    u = 0
  end if
end function

function o (a as boolean, b as boolean) as integer
rem Adjunktion (logisches oder)
  if (a or b) then
    o = 1
  else
    o = 0
  end if
end function

function k (a as boolean, b as boolean) as integer
rem Konditional (Implikation)
  if not (a and not b) then
    k = 1
  else
    k = 0
  end if
end function

function bk (a as boolean, b as boolean) as integer
rem Bikonditional (Aequivalenz)
  if (a = b) then
    bk = 1
  else
    bk = 0
  end if
end function

function sh (a as boolean, b as boolean) as integer
rem Shefferscher Strich (nand)
  if (a and b) then
    sh = 0
  else
    sh = 1
  end if
end function
Danke für eure Unterstützung.

MfG, kondi
Antworten