VYUŽITÍ UMĚLÉ INTELIGENCE V PRAXI

                     aneb vyhněte ( výhněte ) se fatalitám,


         Ahoj, lidi! Dnes je tu  Marky se svojí  hypershow "Jak  oblbnout
      uživatele". Řekněme si tedy jednu základní poučku, podle  které asi
      budete celý život programovat. A tato slavná poučka zní:

         Jediná možnost, jak vydělat, je vydělat na blbosti jiných.

         A  nyní se vám pokusím vysvětlit, jak tato poučka platí ve světě
      umělé inteligence. Většina lidí se domnívá, že pro skutečné myšlení
      počítače je  nutno využívat  množství databází propojených  různými
      závislostmi, a že počítač bude  schopen z těchto dat  pochopit o co
      vlastně jde. Chyťme se tedy  tohoto modelu a splňme  uživateli jeho
      přání. Jen  jednu věc  vynecháme. Myšlení  počítače. Počítač nebude
      přemýšlet, ale pouze porovnávat vstup s již existujícími daty.  Pro
      jednoduchost uvažujme pouze otázky a odpovědi. Potom vytvořme  pole
      do kterých se budou jednotlivé otázky a odpovědi zapisovat. Každé z
      těchto  polí  musí  obsahovat samotná  data a  závislosti na jejich
      protějšcích. Typ takovéhoto pole bude vypadat takto:



      Type Sentence_String = String [ 80 ] ; { Řetezec obsahující data -
                                               - věta }
           TSentence = Record
                             Reading : Sentence_String ;
                             Nodes_Num : Word ;  { Počet závislostí }
                             Nodes : Array [ 1 .. Max_Nod ] Of Word ;
                             { Pole závislostí ( Max_Nod - max. počet ) }
                       End;
           PSentence = ^TSentence ;

      Var Comment : Array [ 1 .. 1000 ] Of PSentence ; { Pole odpovědí }
          Question : Array [ 1..1000 ] Of PSentence ;  { Pole otázek }



         Aby počítač plnil svoji funkci a choval se jako když myslí, bude
      na  každou  otázku  odpovídat  a  po  každé  odpovědi  se ptát. Pro
      zjednodušení se rozkaz bere jako otázka nebo je možné využít rozkaz
      jako povel pro samotný  program { Open new data! a pod. }  Jak nyní
      dosáhnout dojmu  z myšlení. Pokusím  se to vysvětlit  následuijícím
      schématem:


                                     |
                                  +--+--+
                                  |vstup|
                                  +--+--+
                                     |
                          ano    +---+---+    ne
                      +----------+otázka +-----------+
                      |          +-------+           |
                      |                              |
               ano  +-+-+   ne                ano  +-+-+   ne
              +-----+pv.+-----+              +-----+pv?+-----+
              |     +---+     |              |     +---+     |
              |               |              |               |
          +---+---+       +---+---+      +---+---+       +---+---+
          |Inc(po)|       |Inc(po)|      |Inc(p.)|       |Inc(p.)|
          |čo=po  |       |čo=po  |      |č.=p.  |       |č.=p.  |
          |of=čpv.|       |of=opv.|      |of=čpv?|       |of=opv?|
          +-------+       +-------+      +-------+       +-------+

         Vysvětlení zkratek: po  - počet otázek
                             p.  - pocet odpovědí
                             čo  - číslo otázky
                             č.  - číslo odpovědi
                             pv. - předchozí výstupní věta odpověd
                             pv? - předchozí výstupní věta otázka
                             of  - offset ( závislost ) aktuální
                                   zpracovávané věty
                             čpv.- číslo pv.
                             čpv?- číslo pv?
                             opv.- offset pv.
                             opv?- offset pv?

         Poznámka - Nejednodušší způsob, jak zjistit, zdali je věta otázka
                    či ne je testovat otazník na konci.

         Takto tedy vypadá algoritmus pro učení se nových vět. A jak tyto
      věty využívat? Uvažujme, že se uživatel ptá. Program se snaží najít
      otázku s největŠím počtem podobných slov. Pokud je počet  podobných
      slov  větší  než 3  použije nejpodobnější odpověd z jejího offsetu.
      Pokud taková  otázka neexistuje, program podobným způsobem prohledá
      odpovědi a nejpodobnější použije. Pokud ani zde  nevyhoví kritérium
      3 podobných slov, počítač  se zeptá  na kořen. Pro  tuto otázku  je
      třeby změnit nepříklad zájmena. Algoritmus potom vypadá takto.

      ( Teď už barvičky nečekejte )


      Procedure Ask_for_it;

      Var Uff : Sentence_String;

      Function You : Byte;

      Begin
           You:=0;
           For I:=1 To Kuch_Num Do
               If (Repli_Word[I]='you') Or (Repli_Word[I]='You') Then
                  You:=I;
      End;

      Function To_Be : Byte;

      Begin
           To_Be:=0;
           For I:=1 To Kuch_Num Do
               If (Repli_Word[I]='am') Or (Repli_Word[I]='are') Or
                  (Repli_Word[I]='is') Or (Repli_Word[I]='was') Or
                  (Repli_Word[I]='were') Then
                                         To_Be:=I;
      End;

      Function To_Have : Byte;

      Begin
           To_Have:=0;
           For I:=1 To Kuch_Num Do
               If (Repli_Word[I]='has') Or (Repli_Word[I]='have') Or
               (Repli_Word[I]='had') Then
                                     To_Have:=I;
      End;

      Begin
           Repli_Sentence:=Act_Sentence;
           Rozkuchej_Vetu; Repli_Sentence:='';
           For I:=1 To Kuch_Num Do
           If (Repli_Word[I]='My') Or (Repli_Word[I]='my') Then
              Repli_Word[I]:='your'
           Else
               If (Repli_WOrd[I]='Your') Or (Repli_Word[I]='your') Then
                  Repli_Word[I]:='my';
               If To_Have=0 Then
                  For I:=1 TO Kuch_Num Do
                      If (Repli_Word[I]='You') Then
                         Repli_Word[I]:='me'
                      Else
                          If (Repli_Word[I]='I') Then
                             Repli_Word[I]:='you';
                      Repli_Word[1][1]:=Down_Case(Repli_Word[1][1]);
                      If To_Be<>0 Then
                         If (Repli_Word[1]='i') Or (Repli_Word[1]='you')
                            Then
                                Repli_Sentence:=''
                         Else
                             For I:=1 To To_Be-1 Do
                                 Repli_Sentence:=Repli_Sentence+
                                 Repli_Word[I]+' '
                      Else
                          If To_Have<>0 Then
                             If Repli_Word[1]='i' Then
                                Begin
                                     Repli_Sentence:=Repli_Sentence+
                                     'your ';
                                     For I:=To_Have+1 To Kuch_Num Do
                                         Repli_Sentence:=Repli_Sentence
                                         +Repli_Word[I]+' ';
                                End
                             Else
                                 If Repli_Word[1]='you' Then
                                    Begin
                                         Repli_Sentence:=Repli_Sentence
                                         +'my ';
                                         For I:=To_Have+1 To Kuch_Num Do
                                             Repli_Sentence:=
                                             Repli_Sentence+
                                             Repli_Word[I]+' ';
                                    End
           Ufo:=(random(Num_ans-1))+1;
           If Repli_Sentence<>'' Then
              Uff:=Answer[Ufo].Main_part+' '+Answer[Ufo].spojka
              +' '+Repli_Sentence
           Else
               Uff:=Answer[Ufo].Main_part+' ';
           Uff[Length(Uff)]:='!';
           Repli_Sentence:=Uff;
      End;

        Myslím si, že význam většiny proměnných je jasný. Uff a Ufo jsou
      pouze lokální,  Repli_sentence  je  odpověď  počítače. Kuch_num je
      počet slov ve  větě, Rozkuchej_vetu  procedura  pro  rozdělení  na
      slova. Záměna zájmen je ukázána na zájmenech I a you, pro  ostatní
      platí analogicky. Stejně tak tyto algoritmy  platí  analogicky pro
      otázky.
         Doufám, že jste tedy  pochopili, jak  jednoduše napsat  myslící
      program a přeju příjemnou zábavu při rozhovorech.

                                                       Marky

      P.S.:  Příště dodám ještě algoritmus na kořen slova, sem už  by se
           nevešel.


            výheň