K-Prolog Compiler Version 6.0 
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(int i,int *j,double f,double *g)
{
/* iの値は123 */
*j = 456;
/* fの値は45.6 */
*g = 78.9;
}
foo(int *p,int i,int *q)
{
/* pは{1.2} */
/* qは6要素の配列を指している */
for(; --i>=0;)q[i]=i;
}
foo(int *i, int *p)
{
/* pは10要素の配列 */
int k;
for(k=0; k<5; k++)p[k]=k;
*i=5;
}
foo(int *p)
{
/* pは{1,2,3} */
}
foo(int i,int *j,int p[][2])
{
/* pはiX2要素の配列 */
int k;
*j=3;
}
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;
}
foo(int i, float p[][2])
{
/* pは2X2要素の配列、Prologの項が明示的に
限界を表しているときは、限界指定
(この場合、第1引数)は使われない */
}
foo(char *s)
{
/* sには512バイトの領域が
確保されている */
strcpy(s, "abcde");
}
foo(int l,char *s)
{
/* sには10バイトの領域が
確保されている */
strncpy(s,"abcde",l);
}
foo(int m,int l, char *s)
{
/* sは20バイト領域 */
*l=5;
strcpy(s,"abcdefg");
}
foo(char *s)
{
printf("%s\n",s);
}
foo(char **s)
{
int k;
for(k=0;k<3;k++) printf("%s\n",s[k]);
}
foo(int **p)
{
*p=(int*)malloc(100);
}
foo(void *p)
{
/* pは何かのアドレス */
}
int foo(int i)
{
return(i==16);
}
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
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);
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);
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);
p is 10 /* 配列の要素数 */
q(0) = 0 q(1) = 1 … q(9) = 9 /* qは{1,2,...,9} */
bar3() = 1
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);
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);
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
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);
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
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);
int rc;
char *str;
strcpy(str, "Hello World");
rc = bar(str);
printf("bar() = %d\n",rc);
int rc;
char *str;
rc = bar(&str);
printf("%s\n",str);
printf("bar() = %d\n",rc);
int rc;
char *str;
strcpy(str,"世界よこんにちは");
rc = bar(str);
printf("bar() = %d\n",rc);
int rc;
char *str;
rc = bar(&str);
printf("%s\n",str);
printf("bar() = %d\n",rc);
int rc, *p;
p = (char*)malloc(100);
printf("CSideAddress is %x\n",p);
rc = bar(p);
printf("bar() = %d\n",rc);
bar(X) :-
write('PrologSideAddress is '),
write(X),nl.
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);