Chatbot (jetzt auch mit logischem Denken)

  • Da die letze Version dieses Programms (Chatbot kann man das eigentlich nicht mehr nennen) sowohl sprachlich als auch im Bereich Logik sehr eingeschränkt war werde ich natürlich weiterhin versuchen das System so gut wie möglich zu verbessern. Da es scheint als würden sich diese beiden Punkte gegenseitig ausschließen habe ich mit der Logik angefangen, einfach weil es um einiges einfacher ist. :D

    Das Resultat könnte man fast als Prolog Interpreter bezeichnen, auch wenn die Syntax minimal anders ist und nicht alle Features vorhanden sind. So haben wir aber im Vergleich zur alten Version jetzt die Möglichkeit mehrere Bedingungen durch logische Operatoren zu verknüpfen. Außerdem können Funktionen (fast) beliebig ineinandergeschachtelt werden.

    Spoiler anzeigen
    [autoit]

    Func UnnamedFunction($sQuestion, $sData)
    Local $reFact = "(?m)^([a-z]+\((?:[A-Za-z]+,)*[A-Za-z]+\))\."
    Local $reQuestion = "([a-z]+\((?:[a-z]+,)*[a-z]+\))"
    Local $reRule1 = "(?m)^\Q%s=\E([A-Za-z(),]+)\s*$"
    Local $reRule2 = "(?m)^%s\(((?:[A-Z][A-Za-z]*,)*[A-Z][A-Za-z]*)\)=([A-Za-z(),]+)$"
    ; remove
    $sQuestion = StringRegExpReplace($sQuestion, "\s+", "")
    $sData = StringReplace($sData, @CR, "")
    $sData = StringRegExpReplace($sData, "(?m)//.*$", "")
    $sData = StringRegExpReplace($sData, "(?s)/\*.*?\*/", "")
    $sData = StringRegExpReplace($sData, "\h+", "")
    ; expand
    $sData = StringRegExpReplace($sData, $reFact, "\1=true")
    ; evaluate
    Local $_, $aQuestion, $i, $aRule, $aFormula, $sBody, $j
    For $_ = 1 To 100
    $aQuestion = StringRegExp($sQuestion, $reQuestion, 3)
    If (Not @error) Then
    For $i = 0 To UBound($aQuestion)-1
    $aRule = StringRegExp($sData, StringFormat($reRule1, $aQuestion[$i]), 3)
    If @error Then
    $aFormula = StringRegExp($aQuestion[$i], "([a-z]+)", 3)
    $aRule = StringRegExp($sData, StringFormat($reRule2, $aFormula[0]), 3)
    If @error Then
    ; critical - remove if necessary
    If (StringRegExp($aQuestion[$i], "([a-z]+)\(\1\)", 0) = 1) Then
    $sQuestion = StringReplace($sQuestion, $aQuestion[$i], "true", 0, 1)
    Else
    $sQuestion = StringReplace($sQuestion, $aQuestion[$i], "false", 0, 1)
    EndIf
    Else
    $sBody = $aRule[1]
    $aRule = StringRegExp($aRule[0], "([A-Z][A-Za-z]*)", 3)
    If (UBound($aRule) <> UBound($aFormula)-1) Then Return SetError(2, 0, $sQuestion)
    For $j = 0 To UBound($aRule)-1
    $sBody = StringRegExpReplace($sBody, "\b" & $aRule[$j] & "\b", $aFormula[$j+1])
    Next
    $sQuestion = StringReplace($sQuestion, $aQuestion[$i], $sBody, 0, 1)
    EndIf
    Else
    $sQuestion = StringReplace($sQuestion, $aQuestion[$i], $aRule[0], 0, 1)
    EndIf
    Next
    EndIf
    If (StringInStr($sQuestion, "(") = 0) Then ExitLoop
    Next
    ; return
    Return $sQuestion
    EndFunc

    [/autoit]


    Ein Skript in dieser "Programmiersprache" würde nun folgendermaßen aussehen:

    Code
    and(true, true).
    or(true, true).
    or(true, false).
    or(false, true).
    not(false).
    xor(true, false).
    xor(false, true).

    Beachten sollte man hierbei, dass von jedem Ausdruck der nicht bewiesen werden kann automatisch angenommen wird, dass er falsch ist. Somit können wir and in nur einer statt den üblichen vier Zeilen definieren.

    Das Beispiel mit den Vögeln (falls jemand ein kreativeres Beispiel hat nur her damit) könnte man zum Beispiel so implementieren (in Englisch, da Umlaute nicht unterstützt werden):

    Code
    fly(X) = bird(X)
    bird(pigeon).
    bird(penguin).
    fly(penguin) = false

    04.08.2014: Ich habe den ursprünglichen Inhalt dieses Posts jetzt endgültig entfernt, da das Skript wie schon des öfteren erwähnt (leider) nichts mit künstlicher Intelligenz zu tun hat. Ich hoffe das stört niemanden, aber da die Verwendung von INI Dateien sowieso aus irgendeinem Grund Probleme verursacht hatte war das sowieso nicht wirklich von Wert. Version 2, die (wenn auch sehr sehr eingeschränkt) logisches Denken unterstützt, ist weiterhin in Post 9 zu finden. Da die Kommentare #2 bis #8 sich größtenteils auf Version 1 beziehen ist es besser diese direkt zu überspringen und bei Version 2 weiterzulesen.

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    14 Mal editiert, zuletzt von James (9. August 2014 um 11:20)

  • Danke, ja, das ist nicht schlecht (auch wenn es leider nichts mit künstlicher Intelligenz zu tun hat).

    PS: Hat jemand eine Idee, wie man eine richtige AI so in etwa aufbauen müsste?

  • Noch besser wäre allerdings

    Code
    Could you please calculate ([0-9.+*/^\(\) -]+) for Me?

    Dann wird das Calc() überflüssig und man hat folgendes Problem nicht mehr:

    [autoit]

    ConsoleWrite(LookupResponse('Could you please calculate ABC"&MsgBox(0,"","Test")&"XYZ for Me?') & @CRLF)

    [/autoit]


    MfG, James

    Blume Mit der Funktionsweise von ANNs bin ich vertraut,
    ich glaube nur nicht, dass ich das auf den Bereich Chat anwenden kann. ?( :(

  • Ich bin immer noch der Meinung, dass man aus diesem Projekt viel machen kann...
    Deswegen bin ich auch weiterhin an Verbesserungsvorschlägen interessiert, besonders an Möglichkeiten, diesem Bot doch noch etwas Intelligenz beizubringen.

    MfG, James C.

  • Sprachen erkennung um anschließend in der Sprache zu schreiben^^

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Nachdem sich jetzt über ein Jahr nichts mehr an diesem Projekt geändert hatte (ich hatte irgendwann mal angefangen das Datenbankformat zu ändern, habe das aber nie vollendet oder hochgeladen) und das Datenbankformat wirklich schrecklich ist, sowie der Bot über kein bisschen Intelligenz verfügt (auch wenn solche einfachen Programme machen Definitionen nach schon zu künstlicher Intelligenz zählen), präsentiere ich nun voller Stolz eine verbesserte Version mit der Fähigkeit, begrenzt logisch zu denken:

    Vorteile gegenüber der alten Version:

    • die Datenbank basiert nun nicht mehr auf INI Dateien (welche für Probleme gesorgt hatten); außerdem ist sie für Menschen sowie für den Computer bestens lesbar
      Beispiel:
      Code
      Vögel können fliegen.
      Tauben sind Vögel.
      Pinguine sind Vögel.
      Pinguine können nicht fliegen.
    • die Datenbank ist nun um einiges kürzer, da vorhandene Informationen automatisch zu neuem Wissen kombiniert werden
      Beispiel: Die Beispieldatenbank hat 4 Einträge, wir können aber 5 Abfragen machen:
      Code
      Können Vögel fliegen?
      Sind Tauben Vögel?
      Können Tauben fliegen?
      Sind Pinguine Vögel?
      Können Pinguine fliegen?

      (Da das nur ein sehr kleines Beispiel ist, ist der Unterschied natürlich nicht besonders groß. Bei einer Datenbank mit mehreren hundert (oder tausend) Einträgen macht das dann schon etwas mehr aus, da dort viel mehr Kombinationsmöglichkeiten vorhanden sind.)

    Skript
    [autoit]

    #NoTrayIcon
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <GuiEdit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $Filename = @ScriptDir & "\database.txt", $Database
    If FileExists($Filename) Then
    $Database = FileRead($Filename)
    Else
    $Filename = FileOpenDialog("", @ScriptDir, "Text Documents (*.txt)|All Files (*)", 1)
    If @error Then
    MsgBox(16, "Alice", "Database not found." & @CRLF & "http://www.autoit.de/index.php?page=Thread&threadID=31100")
    Exit
    EndIf
    $Database = FileRead($Filename)
    EndIf
    $Database = StringReplace($Database, @CR, "")

    [/autoit] [autoit][/autoit] [autoit]

    Global $GUI, $Edit, $Input, $Button, $Text
    $GUI = GUICreate("Alice", 600, 400)
    GUISetFont(10, 1000, 0, "Courier New")
    $Edit = GUICtrlCreateEdit("", 0, 0, 600, 380, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY, $WS_VSCROLL))
    GUICtrlSetBkColor($Edit, 0xFFFFFF)
    GUICtrlSetColor($Edit, 0x7777777)
    $Input = GUICtrlCreateInput("", 0, 380, 500, 20)
    $Button = GUICtrlCreateButton("Ask", 500, 380, 100, 20)
    GUICtrlSetState($Button, $GUI_DEFBUTTON)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case -3
    ExitLoop
    Case $Button
    $Text = StringStripWS(GUICtrlRead($Input), 7)
    If (StringLen($Text) > 0) Then
    GUICtrlSetData($Edit, GUICtrlRead($Edit) & "You: " & $Text & @CRLF)
    GUICtrlSetData($Edit, GUICtrlRead($Edit) & "Alice: " & Main($Text) & @CRLF)
    _GUICtrlEdit_Scroll($Edit, $SB_SCROLLCARET)
    GUICtrlSetData($Input, "")
    EndIf
    GUICtrlSetState($Input, $GUI_FOCUS)
    EndSwitch
    Until False

    [/autoit] [autoit][/autoit] [autoit]

    Func Main($Question)
    Local $SRE = StringRegExp($Question, "(?i)^(sind|können) ([\wäöüß]+) ([\wäöüß]+)\??$", 3)
    If @error Then Return "Könnten Sie Ihre Frage bitte anders formulieren?"
    Local $Group = $SRE[1], $Keyword = $SRE[0], $X = $SRE[2], $n, $i, $Parent ; "Keyword Object X?"
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s %s %s\E\.?)$", $Group, $Keyword, $X), 0) Then Return "Ja."
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s %s\E (?:nicht|keinen?) \Q%s\E\.?)$", $Group, $Keyword, $X), 0) Then Return "Nein."
    ; nur das Parent ersten Grades wird momentan überprüft
    $Parent = StringRegExp($Database, StringFormat("(?i)(?m)^\Q%s sind\E ([\wäöüß]+)\.?$", $Group), 3)
    If (Not @error) Then
    For $i = 0 To UBound($Parent)-1
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s %s %s\E\.?)$", $Parent[$i], $Keyword, $X), 0) Then Return "Ja."
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s %s\E (?:nicht|keinen?) \Q%s\E\.?)$", $Parent[$i], $Keyword, $X), 0) Then Return "Nein."
    Next
    EndIf
    Return "Das weiß ich leider nicht."
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __Alice_EN($Question)
    Local $SRE = StringRegExp($Question, "(?i)^Are (\w+) (able to|) (\w+)\??$", 3)
    If @error Then Return "Could you please rephrase your question?"
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s are %s %s\E\.?)$", $SRE[0], $SRE[1], $SRE[2]), 0) Then Return "Yes, they are."
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s are not %s %s\E\.?)$", $SRE[0], $SRE[1], $SRE[2]), 0) Then Return "No, they are not."
    ; nur das Parent ersten Grades wird momentan überprüft
    $Parent = StringRegExp($Database, StringFormat("(?i)(?m)^\Q%s are\E (\w+)\.?$", $SRE[0]), 3)
    If (Not @error) Then
    For $i = 0 To UBound($Parent)-1
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s are %s %s\E\.?)$", $Parent[$i], $SRE[1], $SRE[2]), 0) Then Return "Yes, they are."
    If StringRegExp($Database, StringFormat("(?i)(?m)^(\Q%s are not %s %s\E\.?)$", $Parent[$i], $SRE[1], $SRE[2]), 0) Then Return "No, they are not."
    Next
    EndIf
    Return "I am afraid I don't know."
    EndFunc ; used in my IRC bot

    [/autoit]

    MfG James

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    3 Mal editiert, zuletzt von James (31. Oktober 2013 um 21:01)

  • Jetzt musst du nurnoch die neue Database hochladen ;)

    Edit: Und du könntest das @DesktopDir durch @ScriptDir ersetzen oder nachfragen lassen, falls es nicht vorhanden ist ;)

    Edit 2:
    Hab dir mal nen Lösungsvorschlag für "Edit" gebastelt, außerdem hab ich die Variablennamen verändert ([Tutorial] Sauber Programmieren:(

    ChatBot.au3
    [autoit]


    #NoTrayIcon
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <GuiEdit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sFile = FileRead(@ScriptDir & "\database.txt")
    If $sFile = "" Then
    $pDatabase = _SelectPathGUI()
    $sFile = FileRead($pDatabase)
    MsgBox(0, "", $sFile)
    FileCopy($pDatabase, @ScriptDir & "\database.txt")
    EndIf
    Global Const $sDatabase = StringReplace($sFile, @CR, "")

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGUI, $idEdit, $idInput, $idButton, $sText
    $hGUI = GUICreate("Alice", 600, 400)
    GUISetFont(10, 1000, 0, "Courier New")
    $idEdit = GUICtrlCreateEdit("", 0, 0, 600, 380, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY, $WS_VSCROLL))
    GUICtrlSetBkColor($idEdit, 0xFFFFFF)
    GUICtrlSetColor($idEdit, 0x7777777)
    $idInput = GUICtrlCreateInput("", 0, 380, 500, 20)
    $idButton = GUICtrlCreateButton("Ask", 500, 380, 100, 20)
    GUICtrlSetState($idButton, $GUI_DEFBUTTON)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Switch GUIGetMsg()
    Case -3
    ExitLoop
    Case $idButton
    $sText = StringStripWS(GUICtrlRead($idInput), 7)
    If (StringLen($sText) > 0) Then
    GUICtrlSetData($idEdit, GUICtrlRead($idEdit) & "You: " & $sText & @CRLF)
    GUICtrlSetData($idEdit, GUICtrlRead($idEdit) & "Alice: " & _Main($sText) & @CRLF)
    _GUICtrlEdit_Scroll($idEdit, $SB_SCROLLCARET)
    GUICtrlSetData($idInput, "")
    EndIf
    GUICtrlSetState($idInput, $GUI_FOCUS)
    EndSwitch
    Until False

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main($sQuestion)
    Local $asSRE = StringRegExp($sQuestion, "(?i)^(sind|können) ([\wäöüß]+) ([\wäöüß]+)\??$", 3)
    If @error Then Return "Könnten Sie Ihre Frage bitte anders formulieren?"
    Local $sGroup = $asSRE[1], $sKeyword = $asSRE[0], $sX = $asSRE[2], $n, $i, $asParent ; "Keyword Object X?"
    If StringRegExp($sDatabase, StringFormat("(?i)(?m)^(\Q%s %s %s\E\.?)$", $sGroup, $sKeyword, $sX), 0) Then Return "Ja."
    If StringRegExp($sDatabase, StringFormat("(?i)(?m)^(\Q%s %s\E (?:nicht|keinen?) \Q%s\E\.?)$", $sGroup, $sKeyword, $sX), 0) Then Return "Nein."
    ; nur das Parent ersten Grades wird momentan überprüft
    $asParent = StringRegExp($sDatabase, StringFormat("(?i)(?m)^\Q%s sind\E ([\wäöüß]+)\.?$", $sGroup), 3)
    If (Not @error) Then
    For $i = 0 To UBound($asParent) - 1
    If StringRegExp($sDatabase, StringFormat("(?i)(?m)^(\Q%s %s %s\E\.?)$", $asParent[$i], $sKeyword, $sX), 0) Then Return "Ja."
    If StringRegExp($sDatabase, StringFormat("(?i)(?m)^(\Q%s %s\E (?:nicht|keinen?) \Q%s\E\.?)$", $asParent[$i], $sKeyword, $sX), 0) Then Return "Nein."
    Next
    EndIf
    Return "Das weiß ich leider nicht."
    EndFunc ;==>_Main

    [/autoit] [autoit][/autoit] [autoit]

    Func _SelectPathGUI()
    Local $pDatabase
    Local $hSelectPathGUI = GUICreate("Select Path", 505, 97, -1, -1, $WS_SYSMENU + $WS_BORDER) ; Fenster zur Auswahl der database.txt
    GUICtrlCreateLabel("Please set the Path to database.txt:", 10, 10)
    Local $idButtonChoose = GUICtrlCreateButton("Choose Directory...", 395, 5, 100) ; Zum öffnen des Ordnerbrowsers
    Local $idButtonOkay = GUICtrlCreateButton("Okay", 395, 37, 100) ; Bestätigung des Pfades
    Local $idInputPath = GUICtrlCreateInput("", 10, 38, 380)
    GUISetState(@SW_SHOW, $hSelectPathGUI)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case -3
    Exit
    Case $idButtonOkay
    If Not FileExists(GUICtrlRead($idInputPath)) Then
    MsgBox(48, "Wrong Path", "You selected a wrong File. Please try again.")
    $nMsg = $idButtonChoose
    ContinueCase
    Else
    GUIDelete($hSelectPathGUI)
    Return $pDatabase
    EndIf
    Case $idButtonChoose
    $pDatabase = FileOpenDialog("Search for database.txt", @DesktopDir, "Database (database.txt)", 1 + 2) ; Pfad zur database.txt auswählen
    GUICtrlSetData($idInputPath, $pDatabase) ; Angegebener Pfad wird in das Inputfeld eingefügt
    EndSwitch
    WEnd
    EndFunc ;==>_SelectPathGUI

    [/autoit]

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

    2 Mal editiert, zuletzt von Joriktos (17. August 2013 um 14:16)

  • Jetzt musst du nurnoch die neue Database hochladen ;)

    Steht in der Mitte des Posts (die 4 Zeilen in dem ersten Code-Feld). ;)

    Und du könntest das @DesktopDir durch @ScriptDir ersetzen oder nachfragen lassen, falls es nicht vorhanden ist ;)

    Das Skript ist nur ein Test. Außerdem hielt ich jeden hier für fähig genug das selbst anzupassen, da der Pfad am Anfang des Skriptes steht. ;)

    Hab dir mal nen Lösungsvorschlag für "Edit" gebastelt, außerdem hab ich die Variablennamen verändert ([Tutorial] Sauber Programmieren)

    Danke, aber das ist ein bisschen übertrieben, meinst du nicht auch?
    Achja, die Sache mit den Variablennamen. Ich habe mir das über die Jahre so angewöhnt und kann mich irgendwie nicht zu einer besseren Benennung durchringen, schon gar nicht bei so kleinen Skripten. Ich passe das in der Beta dementsprechend an, eine Dateiauswahl habe ich in das Skript oben eingefügt.

    Edit: Irgendwelche Kommentare zum Thema?

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (17. August 2013 um 15:22)

  • Achsoooo, die ist erst so klein :D Ja dann ;)

    Okay, alles klar :) Für das Programm später wäre es sinnvoll :)

    Meinst du jetzt vom Code her? Wenn es so sein sollte: Den hab ich eh schon so vorbereitet gehabt, hab das jetzt schon so ähnlich in 3 meiner Programme verwendet, also musste ich's nur bisschen umschreiben und ich find's nicht übertrieben.
    Also ich finde, dass es seeeehr übersichtlich ist mit den Variablennamen und hab mich auch sehr schnell umgewöhnt. Es hilft einem selbst und vor allem welchen (z.B. mir :D ), die deinen Code anschauen.

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Achsoooo, die ist erst so klein :D Ja dann ;)

    :D Ich wollte ja nur die Funktionsweise demonstrieren. Außerdem würde es wahrscheinlich ewig dauern eine Datenbank mit einer akzeptablen Größe zu erstellen.

    Okay, alles klar :) Für das Programm später wäre es sinnvoll :)

    Falls sich das auf die Dateiauswahl bezieht: Ist eingebaut, siehe Post 9.

    Meinst du jetzt vom Code her? Wenn es so sein sollte: Den hab ich eh schon so vorbereitet gehabt, hab das jetzt schon so ähnlich in 3 meiner Programme verwendet, also musste ich's nur bisschen umschreiben und ich find's nicht übertrieben.
    Also ich finde, dass es seeeehr übersichtlich ist mit den Variablennamen und hab mich auch sehr schnell umgewöhnt. Es hilft einem selbst und vor allem welchen (z.B. mir :D ), die deinen Code anschauen.

    Ja, vom Code her. Du hast Recht, es ist durch die ungarische Notation wahrscheinlich wirklich leichter zu lesen, wobei einen Anfänger wahrscheinlich die regulären Ausdrücke mehr verwirren. :D


    Selbe Frage wie vorher: Hast du irgendwelche Kommentare zum Thema künstliche Intelligenz bzw. logisches Denken von Programmen?

  • Hmm.. Eigentlich hatte ich den Beitrag nochmal editiert um gerade des einzufügen, hat es wohl aber nicht richtig übernommen 8|
    Also an sich ist die Idee sehr gut und du hast es auch sehr gut umgesetzt und mit einer groß genugen Database, kann man mit dem Programm vermutlich seeeehr viel Spaß haben ;) Aber dafür muss es halt erstmal eine große Database geben.

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Also an sich ist die Idee sehr gut und du hast es auch sehr gut umgesetzt

    Danke.

    Aber dafür muss es halt erstmal eine große Database geben.

    Dazu bräuchte man auch erstmal ein geeignetes Thema. Ich glaube nicht, dass die Flugfähigkeiten von verschiedenen Vögeln hier viele Anhänger finden würden. :D

  • Dass Vögel fliegen können kann man zwar eigentlich schon aus dem Code rauslesen, das Programm kann solche Beziehungen aber noch nicht erkennen.

    Ist jetzt behoben.

    Ich hatte mir das insgesamt in etwa so vorgestellt: Ein Teil verarbeitet die Sprache, einer ist für mathematische Sachen zuständig und einer für Logik. Der Logik-Teil ist jetzt eigentlich weitestgehend fertig und diverse Berechnungen auszuführen sollte auch kein Problem sein, das einzige Problem ist also die Sprache, oder genauer gesagt, dass Deutsch/Englisch sehr unregelmäßig sind, im Gegensatz zu zum Beispiel Esperanto. Das könnte man natürlich wieder durch eine Datenbank à la AIML lösen, aber das währe dann eher ein gewaltiger Schritt zurück und soweit will ich die Qualität dann auch nicht senken. :D

    Feedback ist natürlich jederzeit erwünscht, besonders falls jemand eine Idee für das Verarbeiten der Sprache hat.