kprolog K-Prolog Compiler Version 6.0

入口点定義の例


example1
入口点定義
foo(int, *int, [int(2)]/[~1, ~2]).
Prologからの呼びだし
foo(3,J,P).
C言語での処理
    foo(int i, int j, int p[][2]) {
        int     k;
        for(k=0; k<i; k++){
            p[k][0] = i - k; p[k][1] = k - i;
        }
        *j = k;
    }
実行結果
foo(3,3,p(p(3,-3),p(2,-2),p(1,-1)))


example2
入口点定義
foo(int,*int,float,*float).
Prologからの呼び出し
foo(123,J,45.6,G)
C言語での処理
    foo(int i,int *j,double f,double *g)
    {
          /*  iの値は123  */
          *j = 456;
          /*  fの値は45.6 */
          *g = 78.9;
    }
Prologでの結果
foo(123,456,45.6,78.9)


example3
入口点定義
foo([int],int,[int]/[~2]).
Prologからの呼び出し
foo(p(1.2),6,Q)
C言語での処理
    foo(int *p,int i,int *q)
    {
        /*  pは{1.2}  */
        /*  qは6要素の配列を指している */
        for(; --i>=0;)q[i]=i;
    }
Prologでの結果
foo(p(1,2),6,p(0,1,2,3,4,5))


example4
入口点定義
foo(*int,[int]/[10,~1]).
Prologからの呼び出し
foo(I,P)
C言語での処理
    foo(int *i, int *p)
    {
        /*  pは10要素の配列  */    
        int k;
        for(k=0; k<5; k++)p[k]=k;
        *i=5;
    }
Prologでの結果
foo(5,p(0,1,2,3,4))


example5
入口点定義
foo(int(3)).
Prologからの呼び出し
foo(p(1,2,3))
C言語での処理
    foo(int *p)
    {
         /*  pは{1,2,3}  */
    }
Prologでの結果
foo(p(1,2,3))


example6
入口点定義
foo(int,*int,[int(2)]/[~1])
Prologからの呼び出し
foo(10,J,P)
C言語での処理
    foo(int i,int *j,int p[][2])
    {
        /*  pはiX2要素の配列  */
        int k;
        *j=3;
    }
Prologでの結果
foo(10,3,p(p(0,1),p(1,2),p(2,3)))


example7
入口点定義
foo(*int,[float(3)]/[30,~1]).
Prologからの呼び出し
foo(i,p)
C言語での処理
    foo(int *i, float p[][3])
    {
         /*  pは30X3要素の配列  */
         int k;
         for(k=0;k<2;k++){
            p[k][1]=(float)k;
            p[k][2]=(float)(k+1);
            p[k][3]=(float)(k+2);
          }
          *i=2;
    }
Prologでの結果
foo(2,p(p(0.0,1.0,2.0),p(1.0,2.0,3.0)))


example8
入口点定義
foo(int,[float(2)]/[~1]).
Prologからの呼び出し
foo(3,l(p(1.0,2.0),p(1.1,2.1)))
C言語での処理
    foo(int i, float p[][2])
    {
       /* pは2X2要素の配列、Prologの項が明示的に
          限界を表しているときは、限界指定
          (この場合、第1引数)は使われない */
    }
Prologでの結果
foo(3,l(p(1.0,2.0),p(1.1,2.1)))


example9
入口点定義
foo(*char).
Prologからの呼び出し
foo(S)
C言語での処理
    foo(char *s)
    {
         /*  sには512バイトの領域が
             確保されている  */
         strcpy(s, "abcde");
    }
Prologでの結果
foo("abcde")


example10
入口点定義
foo(int,*char/[~1]).
Prologからの呼び出し
foo(10,S)
C言語での処理
    foo(int l,char *s)
    {
           /*  sには10バイトの領域が
               確保されている  */
           strncpy(s,"abcde",l);
    }
Prologでの結果
foo(10,"abcde")


example11
入口点定義
foo(int,*int,*char[~1,~2])
Prologからの呼び出し
foo(20,l,s)
C言語での処理
    foo(int m,int l, char *s)
    {
         /*  sは20バイト領域  */
         *l=5;
         strcpy(s,"abcdefg");
    }
Prologでの結果
foo(10,5,"abcde") /* 長さ5に切り捨てられる */


example12
入口点定義
foo([kanji]).
Prologからの呼び出し
foo("あいうえ")
C言語での処理
    foo(char *s)
    {
         printf("%s\n",s);
    }
Prologでの結果
foo("あいうえ")


example13
入口点定義
foo([*kanji]).
Prologからの呼び出し
foo(s("メニュー0","メニュー1","メニュー2"))
C言語での処理
    foo(char **s)
    {
          int k;
          for(k=0;k<3;k++) printf("%s\n",s[k]);
    }
Prologでの結果
foo(s("メニュー0","メニュー1","メニュー2"))


example14
入口点定義
foo(*(*)).
Prologからの呼び出し
foo(P)
C言語での処理
    foo(int **p)
    {
        *p=(int*)malloc(100);
    }
Prologでの結果
foo(9f63c)


example15
入口点定義
foo(*).
Prologからの呼び出し
foo(9f63c)
/*ただし、引数は別のC言語インタフェースで
ポインタとして作られている */
C言語での処理
    foo(void *p)
    {
        /*  pは何かのアドレス */
    }
Prologでの結果
foo(9f63c)


example16
入口点定義
bool foo(int).
Prologからの呼びだし
foo(16).
C言語での処理
    int foo(int i)
    {
        return(i==16);    
    }
実行結果
true /* 成功 */


example18
入口点定義
dobar([char]).
-bar(*[int],*[float(2)]).
Prologからの呼びだし
dobar("Prolog -> C").
C言語からの呼びだし
    dobar(char *s) {
        int       rc, p、i;
        float   (*q)[2];

        printf("%s\n", s);
        /* ↓Prologの述語の呼びだし */
        rc = bar(&p, &q);
        printf("Array Size = 2x%d\n), p);
        for(i=0; i<p, i++) {
            printf("%2.1f %2.1f \n",q[i][0],q[i][1]);
              /* qは{ {0.0, 1.0}   */
              /*      {2.0, 3.0}   */
              /*          …       */
              /*      {8.0, 9.0} } */
            printf("bar() = %d\n", rc);
              /* rc == 1 ならtrue  */
        }
述語の定義
   :- public bar/2.
   bar(5,p(p(0.0,1.0),p(2.0,3.0),p(4.0,5.0),p(6.0,7.0),p(8.0,9.0)):-
      write("It's OK."),ttynl.
実行結果
    This is bartest !
    Prolog -> C
    It's OK.
    Array Size = 2 x 5
    0.0 1.0
    2.0 3.0    
    4.0 5.0    
    6.0 7.0    
    8.0 9.0
    bar() = 1


example18
入口点定義
-bar(int, *int, float, *float).
C言語からの呼びだし
    int    rc, p; 
    double q;

    rc = bar(123,&p,45.6,&q);
    printf("p is %d q is %f \n", p, q);
    printf("bar() = %d\n",rc);
Prologでの処理
bar(123, 456, 45.6, 78.9).
C言語での結果
p is 456 q is 78.900000
bar() = 1


example19
入口点定義
-bar([int], int, [int]/[~2]).
C言語からの呼びだし
    int rc, p[2], r[6], i;

    p[0] = 1; p[1] = 2;
    for(i=0; i<6; i++) r[i] = i;
    rc = bar(p,6,r);
    printf("bar() = %d\n",rc);
Prologでの処理
bar(p(1,2),6,p(0,1,2,3,4,5)).
/* 成功 */
C言語での結果
bar() = 1


example20
入口点定義
-bar(*int, *[int]).
C言語からの呼びだし
    int  rc, p, *q, i;

    rc = bar(&p,&q);
    printf("p is %d\n",p);
    for(i=0; i<p; i++) printf("q(%d) = %d ",i, q[i]);
    printf("bar() = %d\n",rc);
Prologでの処理
bar(10,p(0,1,2,3,4,5,6,7,8,9)).
C言語での結果
    p is 10   /* 配列の要素数 */
    q(0) = 0 q(1) = 1 … q(9) = 9 /* qは{1,2,...,9} */
    bar3() = 1


example21
入口点定義
-bar(*[int]).
C言語からの呼びだし
    int  rc, *p, i;

    p = (int*)malloc(3*sizeof(int));
    rc = bar(&p);
    for(i=0; i<3; i++) printf("P(%d) = %d ",i, p[i]);
    printf("bar4() = %d\n",rc);
Prologでの処理
bar(p(1,2,3)).
C言語での結果
P(0) = 1 P(1) = 2 P(2) = 3
bar() = 1


example22
入口点定義
-bar(*int, *[int(2)]).
C言語からの呼びだし
    int     rc, p, (*q)[2],i;

    rc = bar(&p,&q);
    printf("Array Size = %d \n", p);
    for(i=0; i<p; i++) {
        printf("q(%d,0)=%d q(%d,1)= %d\n",
            i,q[i][0],i,q[i][1]);
	}
    printf("bar() = %d\n",rc);
Prologでの処理
bar(3,p(p(1,2),p(3,4),p(5,6))).
C言語での結果
    Array Size = 3
    q(0,0)=1 q(0,1)= 2
    q(1,0)=3 q(1,1)= 4
    q(2,0)=5 q(2,1)= 6
    bar() = 1


example23
入口点定義
bar(*int, *[float(3)]).
C言語からの呼びだし
    int     rc, p, i;
    float   (*q)[2];

    i = bar(&p,&q);
    printf("Array Size = %d \n", p);
    for(i=0; i<p; i++) {
      printf("q(%d,0)=%1.1f q(%d,1)=%1.1f q(%d,2)=%1.1f \n",
      i, q[i][0], i, q[i][1], i, q[i][2]);
    }
    printf("bar() = %d\n",rc);
Prologでの処理
bar(2,p(p(0.0,1.0,2.0),p(3.0,4.0,5.0))).
C言語での結果
    Array Size = 2
    q(0,0)=0.0 q(0,1)=1.0 q(0,2)=2.0
    q(1,0)=2.0 q(1,1)=3.0 q(1,2)=4.0
    bar() = 1


example24
入口点定義
-bar(int, [float(2)]/[~1]).
C言語からの呼びだし
    int     rc;
    float   q[2][2];

    q[0][0] = 1.0 ; q[0][1] = 2.0;
    q[1][0] = 3.0 ; q[1][1] = 4.0;

    rc = bar(2,q);
    printf("bar() = %d\n",rc);
Prologでの処理
bar(2,p(p(1.0,2.0),p(3.0,4.0))).
/* 成功 */
C言語での結果
bar() = 1


example25
入口点定義
-bar([char]).
C言語からの呼びだし
    int     rc;
    char    *str;

    strcpy(str,  "Hello World");
    rc = bar(str);

    printf("bar() = %d\n",rc);
Prologでの処理
bar(S) :- display(S),nl.
C言語での結果
bar() = 1


example26
入口点定義 -bar(*[char]).
C言語からの呼びだし
    int     rc;
    char    *str;

    rc = bar(&str);
    printf("%s\n",str);
    printf("bar() = %d\n",rc);
Prologでの処理 bar("I came from Prolog world!").
C言語での結果
I came from Prolog world!
bar() = 1


example27
入口点定義
-bar([kanji]).
C言語からの呼びだし
    int     rc;
    char    *str;

    strcpy(str,"世界よこんにちは");
    rc = bar(str);

    printf("bar() = %d\n",rc);
Prologでの処理
bar(S) :- display(S),nl.
C言語での結果
世界よこんにちは
bar() = 1


example28
入口点定義
-bar(*[kanji]).
C言語からの呼びだし
 
    int     rc;
    char    *str;

    rc = bar(&str);
    printf("%s\n",str);

    printf("bar() = %d\n",rc);
Prologでの処理
bar("論理").
C言語での結果
論理
bar() = 1


example29
入口点定義
bar(*)
C言語からの呼びだし
    int     rc, *p;

    p = (char*)malloc(100);
    printf("CSideAddress is %x\n",p);

    rc = bar(p);
    printf("bar() = %d\n",rc);

Prologでの処理
    bar(X) :- 
        write('PrologSideAddress is '),
        write(X),nl.
C言語での結果
CSideAddress is 14d8b8
PrologSideAddress is 0x14d8b8
bar() = 1


example30
入口点定義
-bar(*,*(*))
C言語からの呼びだし
    int     rc, *p;

    p = (char*)malloc(100);
    printf("BeforSendingAddr is %x\n",p);

    rc = bar(p,&p),

    printf("AfterSendingAddr is %x\n",p);
    printf("bar() = %d\n",rc);
Prologでの処理
bar(P,P).
C言語での結果
BeforSendingAddr is 14d928
AfterSendingAddr is 14d928
bar() = 1


一つ上に戻る 目次に戻る