                  Some Documentation about linking Prolog and C++
                                     from
                    Magazine Popurri PC 2/93 - "Auramedia" CD 

        3.    ...........................37
       맮 㣨 몮  ࡮ ஫...........................37
         । 맮.......................................37
        譨 ।⮢..................................37
       맮 ᮣ襭  । ࠬ஢.........................38
       襭  祭.....................................39
       ᯮ짮 祢 ᫮ as...............................40
       맮 楤, ᠭ  ࡮   ࡮ ஫.......40
       樨  ࡮   ........................41
       맮 ணࠬ  몥 ᥬ  ࡮ ஫............44
       ᯮ짮 ७ ᥬ ࡮ ..................46
       맮 ࡮ ஫  㣨 몮...........................47
       ᪮ । ..............................50
       । ⠢ ꥪ⮢  㣨 모.....................51
       । ᯨ᪮...............................................51
       । ..............................................51
       ਬ........................................................52
       ࠡ⪠ ᯨ᪮..............................................53
       ணࠬ஢   ஢..............................55

                    맮 㣨 몮  ࡮ ஫
       -----------------------------------------------------------------

             ⮬  ࠧ    ᪠,      ,  ⮡
       맢 楤 ᥬ  㭪樨 ࡮   ࡮ ஫.



                  । 맮
       -----------------------------------------------------------------

            । 맮  楤    㭪権,  ᠭ    㣨
       몠,            譨  ।  ࡮
       ஫.  ⠪ 室  ࠢ ४⭮ 맮 
       । ᫥⥫쭮⥩ ࠬ஢,   室 , 
        ࠧ ਠ  譨 ।⮢.   ஥
          㭪  ᫥  ࠧ.


                 譨 ।⮢
       -----------------------------------------------------------------

            ⮡ நନ஢  ⥬  ࡮  ஫    ⮬,  
           ।  ᠭ   㣮 몥,   
        ᯥ䨪 몠      ।⮢,
        ᫥饬:

          global predicates
            add(integer, integer, integer) - (i, i, o), (i, i, i)
            language c
            scanner(string, token) - (i, o) language pascal
            triple(integer, real) - (i, o) language asm

              ࡮  ஫        㪠뢠  ,    
       ;   頥  ஡,  易    맮
       ᮣ襭, :

       ࡮ ஫ 2 #E            - 38 -

          # ଠ  ⨢樨

          # ଠ ࠬ

          # 맮 ᮣ襭

          #  ᮣ襭


                맮 ᮣ襭  । ࠬ஢
       -----------------------------------------------------------------

            ⢮ ஢ 8086    ணࠬ  롮  
       맮 ணࠬ NEAR  FAR.  ࡮ ஫ ॡ, ⮡ 
       맮     ணࠬ   FAR.

                몮  ᥬ⢠ 8086  
       롨  16-  32-ࠧ來묨 㪠⥫ﬨ,   16-ࠧ來
       㪠⥫ 뫠  ᥣ 㬮砭.  ࣠樨 㯠
         ᥩ  ,  ࡮  ஫  ᥣ  ᯮ 32-ࠧ來
       㪠⥫.

             ࣠樨 ⢨  ணࠬ,  ᠭ  
       ,  ࠬ      ⥪    ⭮ 浪 ,  ᫥
       , 㪠⥫ ⥪ ⮬᪨ ᯮᠡ  ࡮
       ஫.      ࣠樨  ⢨    㣨  몠
       ࠬ      筮  浪,    맢  㭪
       ⢥砥  ६饭 ࠬ஢  ⥪.

       ࡮ ஫ 2 #E            - 39 -

                                ⪠
       -----------------------------------------------------------------

       integer      2 

       real         8  (IEEE-ଠ)

       char         1  (2 , ᫨  ⥪)

       string       4-⮢  ᫮ - 㪠⥫  ப

       symbol       4-⮢  ᫮ - 㪠⥫  ப

       compound     4-⮢  ᫮ - 㪠⥫  
       -----------------------------------------------------------------


                襭  祭
       -----------------------------------------------------------------

             ࡮ ஫  ।     ࠧ  ਠ
       ⨯, !!୮,  蠡  .     ⨯ 뢠
       ⤥쭠 楤.   ⠪ 楤    ࡮  ஫  
       ᮣ襭     祭:    ।  ᯮ  
       ७,   䨪 _X   㪠    ਠ,
        X - 楫 ᫮ (稭  0).

            ᬮਬ ᫥ ணࠬ:

          global predicates
            add(2, 3, X), write ("2 + 3 =", X), nl
            add(2, Y, 5), write ("5 - 2 =", Y), nl
            add(Z, 3, 5), write ("5 - 3 =", Z), nl
            add(2, 3, 5), write ("2 + 3 =5").

            㧮  ⮩ ணࠬ  ᮤঠ ᫥騥
       㭪樨 :

            add_0  ࢮ 蠡 (i, i, o)
            add_1  蠡 (i, o, i)
            add_2  (o, i, i)
            add_3  (i, i, i)

             ⢥ ਬ: ᫥騩    ⠭ 
       蠡  । add

            /* ⮬ 䠩 ᮤঠ 㭪樨  蠡 add*/

            add_0(int x, int y, int *z)         /*蠡 (i, i, o)*/
            { *z = x + y; }

            add_1(int x, int *y, int z)         /*蠡 (i, o, i)*/

       ࡮ ஫ 2 #E            - 40 -

            { *y = z - x; }

            add_2(int *x, int y, int z)         /*蠡 (o, i, i)*/
            { *x = z - y; }

            add_3(int x, int y, int z)         /*蠡 (i, i, i)*/
            {if ( (x + y) != z ) fail(); }


                ᯮ짮 祢 ᫮ as
       -----------------------------------------------------------------

             ⢥  ୠ⨢ ⮬ ⮬᪮ ᮣ襭 
       祭      ᯮ짮  祢   ᫮   as   
        :

          global predicates
            scanner(string, token) - (i, o) language c as "_scanner"

             १ ࡮ ஫ 㤥 뫠  㫥  .OBJ  
        _scanner  scanner_0.   뫠   scanner
        室 ⥪  ࡮ ஫.

              ᯮ짮  as ⮫쪮   ⮬  砥,  ᫨
        ।  ⮫쪮  ਠ 蠡.


            맮 楤, ᠭ  ࡮   ࡮ ஫
       -----------------------------------------------------------------

             ⪠  ணࠬ    ࡮ ஫ 뢠,
        ᯥ    楤  double  (ᠭ    ),
        㤢   祭.   ।,       뢠
       楤 ᫥騬 ࠧ:

            double(喥, 句६)

            喥 뢠  楫 ᫮  맮,  ⮬ ᫥
       맮  句६  뢠    㤢  祭 ⮣
       ᫠.

          global predicates
            double(integer, integer) - (i, o) language c

          goal
            double(5, N),
            write(" 5 ࠢ", N).

             ࡮  ஫'᪮  ணࠬ,    ᮤন  맮
       double,   ࠧ global  predicates      㪠  ,
        ᯮ  ⠭ double.

       ࡮ ஫ 2 #E            - 41 -


             室  ⥪       ᯮ짮 ᮣ襭
       ࡮ ஫  祭   ணࠬ .   
       ।    ᫥    ન   楫 ᫮,
       ᮮ⢥饥 蠡.

             void double_0(int in, int *out)  /*ᠭ ।*/
             {                                /*double  */
                 *out = in + in;
             }

                樨  ࡮   
       -----------------------------------------------------------------

             ⮣,  ⮡ 易 㫨  ࡮     ﬨ  
       ࡮  ஫,      ஢     ᫥騬
       ﬨ:

          # ஢   TC.EXE

            1. Options/Compiler/Model/Large

            2. Options/Compiler/Optimization/Jump Optimization...On

            3. Options/Compiler/Code generation/Generate underbars...
       Off.

            (    뢠 -楤 稭騬  
       ન).

          # ஢   TCC.EXE

            -ml -O -u- -Z -c

            ࡮ ஫  ࡮         ᫥饩
        ப:

            tlink init <pOBJS> <cOBJS> <.sym>, [exe], [map], [usr]
            + prolog[+emu+mathe+cl]

             ⢥  த     ப,      ன
       㬥  ᫥饥:

       㬥         
       -----------------------------------------------------------------

       tlink     砥 TLINK, ࡮ 騪 Borland

       init       樠樨 ࡮ ஫

       pOBJS     뫪   .OBJ-㫨 ࡮ ஫


       ࡮ ஫ 2 #E            - 42 -

       cOBJS     뫪   㫨 ࡮ 

       .sym       䠩 ࡮ ஫;   ᫥
                 䠩 । ⮩

       exe       (易⥫쭮)  믮塞 䠩

       map       (易⥫쭮)  map-䠩

       usr       뫪         (易⥫)   ᯨ᮪    䠩
                 짮⥫᪮ ⥪

       prolog    뫪  PROLOG.LIB

       emu       뫪  (易⥫) -⥪ 樨 
                 饩 窮, EMU.LIB

       mathe     뫪  (易⥫) -⥪ ⥬⨪,
                 MATHL.LIB

       cl        뫪  (易⥫) -⥪ CL.LIB
       -----------------------------------------------------------------

             த  ப  ।,   PDOUB.PRO
       ᪮  .OBJ,     ᫥騥  ப
        뢠 PDOUB.PRO  CDOUB.C:

            tcc -ml -O -u- -r- -c cdoub    /* CDOUB.C  OBJ*/
            tlink init pdoub cdoub pdoub .sym, pdoub, ,prolog

            ୠ⨢ ᯮ짮  TLINK  㦨  ᮧ   䠩
       । ஥ CPROJ.PRJ    㫥  ஥:

            pdoub
            cdoub.obj

       砭:  ७  ꥪ⭮ 䠩   ⠢
                   ࡮ ஫  ஢.  ᫨  
                   ७ 䠩 ,  ࡮ ஫
                  뤠  ᮮ饭  訡.  ,    蠥
                  ⥬ 易 䠩 ᯥ譮.  ᫥  ᮧ  䠩
                  । ஥,  ,     ॡ,  
                    ࡮ ஫    ஥. ᫨
                  - 㦥    ᪮஢  CDOUB.OBJ,   
                  筮  Compile/EXE  File  (᫥  㧪
                  ணࠬ   PDOUB.PRO      ⥪⮢  ।  ࡮
                  ஫)     ⥬   ࡮   ஫   ⮬᪨
                  ᪮    裡.   ᫨      㦭   譨
                  ⥪,    㪠    O/L/Libraries

       ࡮ ஫ 2 #E            - 43 -


          project "cproj"
          global predicates
            double(integer, integer) - (i, o) language c

          goal
            double(5, N),
            write(" 5 ࠢ", N).


       ࡮ ஫ 2 #E            - 44 -

             맮 ணࠬ  몥 ᥬ  ࡮ ஫
       -----------------------------------------------------------------

            ।,        楤  double  
       몥  ᥬ.  ணࠬ  ࡮  ஫,  ᮤঠ  맮
       double,  ᮤঠ  global predicates :

          global predicates
            double(integer, integer) - (i, o) language asm

            ᯮ짮 language asm  ࡮ ஫  ⮬,
        ࠬ 㦭  롨  ᫥  ࠢ,    ᮮ頥,  
       맢 ணࠬ 㤥 롨 ࠬ  ⥪.

             ⨢樨,   ᯮ    設  ⥪,  
       ⨢樨 double ਭ ,   .3.1.

       --------------    -----------------------------------------------

       [] + 10          祭,   뢠 喥
                          = 2 
                         -----------------------------------------------

       [] + 6           ,   ࠭ 句६
                          = 4 
                         -----------------------------------------------

       [] + 2           ,  ண த 믮
                          ᫥ 믮 double = 4 
                         -----------------------------------------------

       [] + 0           । ⠭  (। ⥬, 
                          砫 믮 double) = 2 
       --------------    -----------------------------------------------

                          .3.1.  ⨢樨.

            ᭮ ⥪ double  몥 ᥬ 룫廊 ᫥騬
       ࠧ:

       MOV   AX, [] + 10;  砥 祭,   뢠
                             喥

       ADD   AX, AX;         㤢  祭

       LDS   SI, DWORD PTR [] + 6;   祭 句६ 
                                      ⨬ 

       MOV   [SI], AX

            ᫥  ⢥ত,  室  ࠭ SP
        -ॣ஢ ࡮ ஫  裡  ᥬ୮  ࠣ  
       㫥 .OBJ ࡮ ஫,  砥 ᫥騩 :

       ࡮ ஫ 2 #E            - 45 -


                          name       double

       DOUBLE_TEXT      segment    byte public 'CODE'
       DGROUP           GROUP      _DATA,_BSS
                                   assume cs:DOUBLE_TEXT,ds:DGROUP
       DOUBLE_TEXT      ends
       _DATA            segment    word public 'DATA'
       d@               label      byte
       _DATA            ends
       _BSS             segment    word public 'BSS'
       b@               label      byte
       _BSS             ends
       DOUBLE_TEXT      segment    byte public 'CODE'
       ; Line 3
       DOUBLE_0         prog       far
                        push       bp
                        mov        bp,sp
                        mov        ax,word ptr [bp+10]
                        add        ax,ax
                        les        bx,dword ptr [bp+6]
                        mov        word ptr es:[bx],ax
                        pop        bp
                        ret        6
       DOUBLE_0         endp
       DOUBLE_TEXT      ends
       _DATA            segment    word public 'DATA'
       s@               label      byte
       _DATA            ends
       DOUBLE_TEXT      segment    byte public 'CODE'
                        public DOUBLE_0
       DOUBLE_TEXT      ends
                        end

            ᫨  ᥬ   ணࠬ    䠩  MYASM.OBJ,  
       뢠騩  ꥪ  ࡮ ஫  MYPROLOG.OBJ,  
          易    ப:

            tlink init + myprolog + myasm + myprolog.sym, mixprog, ,
            prolog

             室  믮塞 ணࠬ 䠩 MIXPROG.EXE
       (ᯮ騩 ⥪ PROLOG.LIB).    MYPROLOG.SYM  
        ᫥ । ⮩.

             ,  ଠ    ⨢樨   ᫠
       㬥⮢  뢠饬 । ࡮ ஫   ⨯ ,
       ᮮ⢥   ⨬   㬥⠬.  ਬ,  ᫨    
       ।

            add(Val1, Val2, Sum)

        Val1,  Val2  Sum ਭ   ⨯  integer,  

       ࡮ ஫ 2 #E            - 46 -

       ⨢樨 ਬ ,   .3.2.

       --------------    -----------------------------------------------

       [] + 10          ,   ᯮ 稭 SUM.
                          4 
                         -----------------------------------------------

       [] + 8           稭,  ன 뢠 Val2
                          2 
                         -----------------------------------------------

       [] + 6           稭,  ன 뢠 Val1
                          2 
                         -----------------------------------------------

       [] + 2           ,  ண த 믮
                          ᫥ ⮣,  믮 add. 4 
                         -----------------------------------------------

       [] + 0           । ⠭  (। ⥬, 
                          砫 믮 add). 2 
       --------------    -----------------------------------------------

                          .3.2.  ⨢樨.

            ⨬,    㬥  ᮮ⢥饥 ᫮
       .  室 㬥⮢ ࠧ ᥣ 4  (ᯮ㥬
           ᥣ  ᬥ饭);   室 㬥⮢ ࠧ
       । 祭,  ᠭ  ⥪, ⮬   
       ᮮ⢥饣 ⨯ .

             ⮬  ਬ  Val1    Val2  (ਭ騥    ⨯
       integer  ᯮ㥬   蠡    (i),  ..  室)  
         2 ,   Sun (ᯮ㥬  蠡 (o)) 
       4 .

            ⬥⨬ ⠪,     ࡮  ஫  맮
       譥 ।  

                               /*ᥭ ࠬ஢*/
       MOV      AX, SEGMENT DATA
       MOV      DS, AX
       CALL     FAR PTR EXTERNEL_PREDICATE_IMPLEMENTATION

       ⮬ ॣ  DS  ⠭    㪠 ᥣ DATA ।
       ⥬,  ⥬ 뢠 楤  譥 ।.

                ᯮ짮 ७ ᥬ ࡮ 
       -----------------------------------------------------------------

            ᫨   ࣠ 䥩  ࡮  ஫  

       ࡮ ஫ 2 #E            - 47 -

       ᥬ஬,      ⥫쭮  ४㥬   ᯮ짮
       ७  ᥬ ࡮ .     २⢠:

            1. ணࠬ஢  ᥬ   .

            2. ࡮      㤥   ⮬᪨   ࠢ  ।祩
       ࠬ஢  ।ﬨ ᥣ⮢.  ਬ,  DOUBLE.ASM 뫠
       ᣥ஢  ᫥饣  ࡮ :

            pascal double(int X, int *Y)
            {
               *Y = X + X;
            }

             樥  -S,      "஢  
       ᥬ". ᫨  ᯮ  ࡮  ४⨢ 
       pascal,    ᮧ    ⨢樨,  
       ⮩,    ᯮ  ࡮  ஫    砥,     
        । 㪠뢠 language asm.

                맮 ࡮ ஫  㣨 몮
       -----------------------------------------------------------------

             ⮫쪮 ࡮ ஫  뢠  ।, ᠭ
         㣨  몠;  㣨  모  ⮦  뢠 ।
       ࡮ ஫. ᫨  ।   騩
        㣮 몥   ⮣ ।  ।,  ࡮
       ஫ ᮧ ᯮᮡ  맮  ⮣ 몠 楤.

             ணࠬ  ࡮ ஫   2 
       ।    몠  ࡮    -  message  hello_c.  ।
       message   맢  -      㭪樨
       message_0  室 .

                     /*ணࠬ CH22EXO1.PRO - ࡮ ஫*/

          global predicates
            message(string) - (i) language c
            hello_c - language c

          clauses
            message(S) :-
               makewindow(13,7,7,"",10,10,3,50),
               write(S), readchar(_),
               removewindow.

          goal
            message("ਢ  ࡮ ஫"),
            hello_c.

             goal  CH22EXO1.PRO 뢠 㭪 ࡮  hello_

       ࡮ ஫ 2 #E            - 48 -

       c,  ,   ᢮ ।,  뢠  ।  ࡮  ஫
       message_0, ⮡ 뢥 ᮮ饭.

                     /*ணࠬ CH22EXO2.PRO - ࡮ */

            void hello_c_0()
            {
               message_0("ਢ  ࡮ ");
            }

              ᯮ짮    ,  ⮡  ᯥ
          魮 ⥪ ࡮ ஫  㣨 몮.

                 ।    ᮡ⢥ 
       ணࠬ  㫥 ࡮ ஫, ਬ, ⠪:

                     /*ணࠬ CH22EXO3.PRO*/

          project "dummy"

          constants
            & 롮 뢠饣 몠 -   ᪠
            lang = c

          global predicates
            myfail language lang as "fail"
            mymakewindow(integer,integer,integer,string,integer,integer,
            integer,integer) - (i,i,i,i,i,i,i,i) language lang as
            "makewindow"
            myshiftwindow(integer) - (i) language lang as "shiftwindow"
            myremovewindow language lang as "removewindow"
            write_integer(integer) - (i) language lang as
            "write_integer"
            write_real(real) - (i) language lang as "write_real"
            write_string(string) - (i) language lang as "write_string"
            myreadchar(char) - (o) language lang as "readchar"
            myreadline(string) - (o) language lang as "readline"

            extprog language lang as "extprog"

          clauses
            myfail :- fail.

            mymakewindow(Who, Wattr, Fattr, Text, Srow, Scol, Rows,
            Cols) :-
              makewindow(Who, Wattr, Fattr, Text, Srow, Scol, Rows,
              Cols).

            myshiftwindow(WNO) :- shiftwindow(WNO).

            myremovewindow :- removewindow.

            write_integer(I) :- write(I).

       ࡮ ஫ 2 #E            - 49 -


            write_real(R) :- write(R).

            write_string(S) :- write(S).

            myreadchar(CH) :- readchar(CH).

            myreadline(S) :- readline(S).

            ⠭ land    ᢮  pascal,  c    asm.
        楤 , extprog,  ᯮ짮 
         ணࠬ.  extprog ᮧ  ࡮ ஫,
        ⥬ ந १  ⥭  .

                     /*ணࠬ CH22EXO4.PRO*/

          extprog()
          {
            char dummychar;
            char *Name;

            makewindow(1,7,7,"ਢ      ",5,5,15,60);
            write_string("\n\nIsn't it easy");
            readchar(&dummychar);
            write_string("\n ᢮ : ");
            readline(&Name);
            write_string("\n : ");
            write_string(Name);
            readchar(&dummychar);
            removewindow();
          }

            ⢥ ࠭祭    맮 ࡮ ஫  㣨
       몮  ,   ணࠬ  ࡮ ஫    
       ,  .. ࡮ ஫ 室 ⠭   ⥪.

       ࡮ ஫ 2 #E            - 50 -

                      ᪮ । 
       -----------------------------------------------------------------

             ᠭ 㭪権  㣨 몠    室
       ।      ᪨.   ᪮   ࡮   ஫
       ஫   ணࠬ      ,         
       ᯮ짮 ணࠬ ࡮   । .

            ,  ⥪ ࡮ ஫  ணࠬ _malloc
        _free (࡮ ஫-ᨨ 㭪権  malloc  free).   
       뢠  ࡮  ஫    ,  ᫨  ⥪ ࡮ ஫
       PROLOG.LIB 㪠 ࠭ ⥪ ,    ணࠬ  
         PROLOG.LIB  ⥪ .

            void *_malloc(unsigned size);
            void *_free(void *);

            ᫨    ࠧ  -    쭮  ⥪
       ࡮ ஫,        ᤥ ,  맢 
       ணࠬ alloc_gstack:

            void *alloc_gstack(unsigned size);

       alloc_gstack 頥 㪠⥫         size.
          ⢮     쭮  ⥪.  ᫨    ᯮ
       alloc_gstack,    㤠筮 襭    ⮬᪨
       ᢮,    ᫮        ࡮   ஫   
       । .


       ࡮ ஫ 2 #E            - 51 -


                 । ⠢ ꥪ⮢  㣨 모
       -----------------------------------------------------------------

            ।  ⨯  (integer,  real, char, symbol,
       string) 믮 ।⢥ ()  ⢨
       ࡮  ஫    㣨  몠.    ⮬  ࠧ  ᤥ
       ⪮     ,    ।  ᫮    ࡮
       ஫: ᯨ᪨  ⠢ .


                 । ᯨ᪮
       -----------------------------------------------------------------

             ࡮ ஫    ᯨ᮪ ப  strlist 
       ࠧ domains:

          domains
            strlist = string*

              ᯨ᮪ ⨯ string.  ᯨ᮪ ।⠢
             吝  ᯨ᮪.      吝 ᯨ᪥
       ᮤন  :

                                      
       -----------------------------------------------------------------

       㭪 ᯨ᪠               1 

        ᯨ᪠               ⢥騩 

       ⥫  ᫥饣      4 
       -----------------------------------------------------------------

             ᮢ㯭  ⮡ࠦ       
        strlist:

          struct node {
            unsigned char functor;           /*⨯*/
            char *value;                     /*㪠⥫ ப*/
            struct node *next;               /*㪠⥫  */
          } strlist;

             "㭪"  㪠뢠 ⨯  ᯨ᪠.  祭 ࠢ
       1, ᫨   ᯨ᪠,  2 - ᫨  ᯨ᪠.


                । 
       -----------------------------------------------------------------

            ⠢   ࡮ ஫ ।⠢  .
                ᮤন   㭪,   ᮮ⢥騩

       ࡮ ஫ 2 #E            - 52 -

            ࡮  ஫,    ⠫쭮  ᮮ⢥
       ⠬ ⠢ ꥪ. ਬ,  ⮬ ࠣ

          domains
            mydom = i (integer); c (char); s (string)

       㭪 㤥 ࠢ 1  ࢮ ୠ⨢,  i (integer);  2 -
        ன, c (char); 3 -  쥩  ..

            typedet ࡮   mydom   ⠪:

          typedet struct {
            unsigned char type;
              union {
                 int i;
                 char c;
                 char *s;
              }
          } "mydom";

            ᫨   ᮧ    頥  ⠢  ꥪ  ⠪
       ࠧ,   ᯥࢠ 맢  alloc_gstack,  ⮡  뤥
           쭮  ⥪    ꥪ  (  )  ।
       ᢮ 祭 ⠬ ⮩ .


                ਬ
       -----------------------------------------------------------------

            騩 ਬ   ணࠬ   ।⠢  ᮡ    
       ᮧ 㭪 ࡮  ஫    ࡮        ⮩
          ࡮ ஫.   ਬ ⠪ ,  
         ।   쭮 ⥪  ࡮ ஫.

            । pack ਭ  integer,  char,  real    string  
          ⠢ ꥪ 짮⥫᪮  mydom.

            ࢠ ᬮਬ 室 ⥪  ࡮ ஫:

                     /*ணࠬ CH22EXO5.PRO*/

          project "mypack"

          global domains
            mydom = f(integer, char, real, string)

          global predicates
            pack(integer, char, real, string, mydom) -(i,i,i,i,o)
            language c

          goal
            pack(1, 'a', 99.9, "HELLO", X),

       ࡮ ஫ 2 #E            - 53 -

            write(X), nl.

             ⥯ 室 ⥪  ࡮ .

                     /*ணࠬ CH22EXO6.C*/

          void *alloc_gstack(unsigned);

          typedet struct {
            unsigned char functor;                /*Type of functor*/
                 int ival;                   /*Value of the functor*/
                 char cval;
                 double rval;
                 char *sval;
          } mydom;

          pack_0(int P1, char P2, double P3, char **P4, mydom **P5)
          {
            mydom *p=*P4=alloc_gstack(sizeof(mydom));
            p->functor=1;
            p->ival=P1;
            p->cval=P2;
            p->rval=P3;
            p->sval=P4;
          }

           ,  맮 alloc_gstack 뤥    쭮
       ⥪   ࠧ஬  sizeof(mydom) .

            ⥬ ࡮  ஫  殮  㫨  .OBJ      
       室,  ᫨    롥  Compile/Project,     䠩   .PRJ,
       MYPACK.PRJ, 㤥 । 

            CH22EXO5
            CH22EXO6


                ࠡ⪠ ᯨ᪮
       -----------------------------------------------------------------

             ⮬ ࠧ          ਬ,  
       ,  ८ࠧ ᯨ᮪  ᨢ  ⭮.

            ணࠬ    ListToArray  ਭ  ᯨ᮪  楫  ᥫ,
       ८ࠧ   ᨢ,  ᯮ    쭮  ⥪  
       頥 ᫮  ⮢.  ८ࠧ  믮    
       ⠯:

            1. ᮪  ᬠਢ     ⮣,   ⮡   ।
       ⢮ ⮢.
            2. ⢮   ᨢ.
            3. ᮪ ᬠਢ ᭮,    ७ 

       ࡮ ஫ 2 #E            - 54 -

       ᨢ.

            ணࠬ  ArrayToList ਭ  楫᫥  ᨢ  
         ࠧ    㬥,  ⥬ ८ࠧ   ᯨ᮪ 楫
       ᥫ.   ணࠬ  ⮫쪮  ண,   ᯨ᮪ 
        ᬮ ᨢ.

             楤   inclist   뢠,    ᯮ짮
       ListToArray  ArrayToList.  ᫨   ᯨ᮪  楫  ᥫ,  
       inclist  ८ࠧ  室 ᯨ᮪  ᨢ,  㢥稢 ᫮
       ⮢ ᨢ  1, ⥬ ८ࠧ ᨢ ⭮  ᯨ᮪
       楫 ᥫ.

                     /*ணࠬ CH22EXO7.PRO*/

          project "mycnvrt"

          global domains
            list = integer*

          global predicates
            inclist(list, list) - (i,o) language c

          goal
            inclist([1, 2, 3, 4, 5, 6, 7], L), write(L).

               ணࠬ  ,  ।    楤   
       ListToArray    ArrayToList    譨  ।  ࡮  ஫
       inclist.

                     /*ணࠬ CH22EXO8.C*/:

          &define listfno  1
          &define nilfno   2

          void *alloc_gstack(unsigned);

          typedet struct ilist {
            unsigned char Functor;
            int Value;
            struct ilist *Next;
          } IntList;

          int ListToArray(IntList *List,int **ResultArray)
          {   /*Convert a list to an array placed on the global stack*/

            IntList *SaveList = List;
            int *Array;
            int i = o;

                 /*稪 ⢠ ⮢  ᯨ᪥*/
            for(i=o; List->Functor==listfno; List=List->Next)
               i++;

       ࡮ ஫ 2 #E            - 55 -


            Array = alloc_gstack(i*sizeof(int));   /* ।
                                                   室 */
            List = SaveList;      /* 뫪 ⮢  ᯨ᪠ 
                                     ᨢ */

            for(i=o; List->Functor==listfno; List=List->Next)

            Array[i++]=List->Value;

            *ResultArray=Array;
            return(i);
          }

          ArrayToList(int Array[],int n,IntList **List) /*८ࠧ
                                                      ᨢ  ᯨ᮪*/
          {

            int i;

            for (i=o; i<n; i++)   /*宦   */
            {
               IntList *p=*List=alloc_gstack(sizeof(IntList));
               p->Functor=listfno;
               p->Value=Array(i);
               List=&(*List)->Next;
            }

            {                  /*宦 ᫥   ᯨ᪥*/
               IntList *p=*List=alloc_gstack(sizeof(char));
               p->Functor=nilfno;
            }
          }

          inclist_0(IntList *InList,IntList **OutList)
          {                         /* 祭  1  祭 
                                       ᯨ᪥*/
            int i, n, *Array;
            n=ListToArray(InList,&Array);
            for (i=o; i<n; i++) Array[i]++;
            ArrayToList(Array,n,OutList);
          }
                ணࠬ஢   ஢
       -----------------------------------------------------------------

            訬 ⮤ ணࠬ஢   ஢ 
       ᯮ짮 ७ ᥬ ࡮ .   砥, 
       ࡮        ᥡ  । ࠬ஢,  ࠭  
        ᥣ⮢.)   ⠫쭮  ⢠    ७
       ᥬ஬ . "㪮⢮ 짮⥫ ࡮ ".)

             ⮬   ਬ  ᯮ짮  ७  ᥬ  

       ࡮ ஫ 2 #E            - 56 -

       ⠭ 㭪 date,    ⥬ ࡮
       ஫.      ਬ          ⭮⥫쭮
       ணࠬ஢  .

                     /*ணࠬ CH22EXO9.PRO*/

          project "dateproj"

          global predicates
            mydate(integer,integer,integer) - (i,i,i)(o,o,o)
            language asm

          goal
            mydate(Y,M,D),
            write("\nYear=", Y, ", Month=", M, ", Day=", D),
            mydate(1988, 3, 3),
            mydate(Y1, M1, D1),
            write("\nYear=", Y1, ", Month=", M1, ", Day=", D1).

            ᫨ ।   楤ன   ࡮    ᯮ짮  ४⨢
       pascal,  ࡮  ᮧ    ⨢樨,   ࡮
       ஫    樨  asm.  ணࠬ  ࡮   룫廊 ᫥騬
       ࠧ:

                     /*ணࠬ CH22EXO10.C*/:

          pascal mydate_0(int Year, int Month, int Day)
          {
            asm mov   cx,Year
            asm mov   cx,Month
            asm mov   cx,Day
            asm mov   ah,02BH
            asm int   21H                          /*Set the new date*/
          }

          pascal mydate_1(int *Year, int *Month, int *Day)
          {
            asm mov   ah,2AH
            asm int   21H

          /*Now the date is placed in the registers: CX=Year, DH=Month,
            DL=Day*/

            asm les   di,Year
            asm mov   es:[di],cx
            asm les   di,Month
            asm mov   es:[di],dh
            asm mov   es:1[di],byte ptr 0
            asm les   di,Day
            asm mov   es:[di],dl
            asm mov   es:1[di],byte ptr 0
          }


       ࡮ ஫ 2 #E            - 57 -

             ।   ஥     ⮬᪮  
        룫拉 ⠪:

            prodate
            cdate

            ᫨       -S   ࡮  (ᯮ
       ,   ப  ࡮ ),  
       ᮧ ᥬ ⨭ 稢襩 ணࠬ:

                        name      CH22EXO10
       CH22EXO10_TEXT   segment   byte public 'CODE'
       DGROUP           group     _DATA,_BSS
                        assume    cs:CH22EXO10_TEXT,ds:DGROUP
       CH22EXO10_TEXT   ends
       _DATA           'segment   word public 'DATA'
       d&               label     byte
       _DATA            ends
       _BSS             segment   word public 'BSS'
       b&               label     byte
       _BSS             ends
       CH22EXO10_TEXT   segment   byte public 'CODE'
       ; Line 3
       MYDATE_0         prog      far
                        push      bp
                        mov       bp,sp
       ; Line 4
                        mov       cx ,[bp+10]
       ; Line 5
                        mov       dh ,[bp+8]
       ; Line 6
                        mov       dl ,[bp+6]
       ; Line 7
                        mov       ah ,02BH
       ; Line 8
                        int       21H
       @1:
                        pop       bp
                        ret       6

       MYDATE_0         endp
       ; Line 11
       MYDATE_1         prog      far
                        push      si
                        push      di
                        push      bp
                        mov       bp,sp
       ; Line 12
                        mov       ah ,2AH
       ; Line 13
                        int       21H
       ; Line 14
       ; Line 15

       ࡮ ஫ 2 #E            - 58 -

                        les       di ,[bp+18]
       ; Line 16
                        mov       es :[di ],cx
       ; Line 17
                        les       di ,[bp+14]
       ; Line 18
                        mov       es :[di ],dh
       ; Line 19
                        mov       es :1[di ],byte ptr 0
       ; Line 20
                        les       di ,[bp+10]
       ; Line 21
                        mov       es :[di ],d1
       ; Line 22
                        mov       es :1[di ],byte ptr 0
       @2:
                        pop       bp
                        pop       di
                        pop       si
                        ret       12
       MYDATE_1         endp
       CH22EXO10_TEXT   ends
       _DATA            segment   word public 'DATA'
       s&               label     byte
       _DATA            ends
       CH22EXO10_TEXT   segment   byte public 'CODE'
                        public MYDATE_1
                        public MYDATE_0
       CH22EXO10_TEXT   ends
                        end

