イフコンピュータ > IF/Prolog > マニュアル > IF/Prolog V4.1 マニュアル > IF/Prolog Interfaces > FORTRANインタフェースマニュアル > イントロダクション > バックトラックしないProlog述語をFORTRANで書く

バックトラックしないProlog述語をFORTRANで書く

IF/Prolog by Siemens
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

FORTRANで書かれたユーザ定義の述語が使えるようになったIF/Prologの新バージョンを生成するためには、以下の手順に従わなければなりません。

1. 持っている課題のFORTRANプログラムを書く。

2. FORTRAN関数をProlog述語に接続する。

3. FORTRAN関数がPrologに成功か失敗かのどちらかを返すことを確かめる。

4. 必要であれば、IF/Prologがゴール引数を入力パラメータとしてFORTRAN関数に渡すかどうかを確かめる。

5. FORTRAN関数がIF/Prologにパラメータを戻すことを確かめる。

6. 必要であれば、FORTRAN関数で型チェックと例外処理を行なうようにする。

7. 全ての述語をコンパイルし、リンクする。

ステップ1: あなたのFORTRANプログラムを編集します。ここでは、例えば、`newspreds.for' というファイルを編集します。

例として、以下の問題を考慮します。

Prologの述語`idplus(Int,Real,Sum)'を組み込み述語としてシステムに含めたいのだとします。

その述語の第一引数に4バイト整数、第二引数に浮動小数点数を与えると、第三引数にはそれらの和を返します。

`FORTRAN 77'で書けば、対応する`IDPLUS'のサブルーチンは以下の通りです:

!-------------------------------------------------------------

SUBROUTINE IDPLUS(N,A,SUM) INTEGER*4 N REAL*8 R,SUM SUM=N + R RETURN END

!-------------------------------------------------------------

ステップ 2: あなたのプログラムをFORTRAN単独でテストしたあと、CBOOT関数の定義に次のステートメントを加えます:

!-------------------------------------------------------------

FUNCTION CBOOT CBOOT=IFCPRIM('idplus',3, IDPLUS) RETURN

!-------------------------------------------------------------

FORTRANの関数をPrologの述語にリンクするために、下のIFCPRIM行が必要です:

CBOOT=IFCPRIM('ROLOG-FUNCTOR',ARITY,FUNCT-REF) ...

一度それらの語句が挿入されれば、その新たに組み込まれたProlog述語の関数子と引数の数は成立します。

ステップ 3: 述語の実行が成功したかどうかをPrologに知らせるために、そのFORTRANルーチンはIF/Prologに値を返さなければなりません。

従って、FORTRANのサブルーチン宣言をFORTRANの関数宣言に変えなければなりません。また、関数も1か0を返さなければなりません。

ステップ 4: FORTRANの関数からは、IF/Prologライブラリ関数`IFARG'により、Prologで表現されているゴールの引数にアクセスすることができます。

そして、IF/Prologライブラリ関数`IFINTCP'と`IFDBLCP'を使用すれば、数値をIF/Prologでの表現から対応するFORTRANでの表現に変換することができます。

同様に、IF/Prologライブラリ関数`IFINTPC'と`IFDBLPC'は、数値をFORTRANでの表現から対応するIF/Prologでの表現に変換します。

上記のライブラリ関数と次のセクションで記述されるライブラリ関数は、オブジェクト・コード・ライブラリPROROOT:[C]LIBIFPROLOG.OLBに収められています。

ステップ 5: `IFUNIFY'と`IFUNIFYARG'はIF/Prologライブラリの関数コールで、引数をFORTRAN関数からProlog述語に渡します。これらについての説明は、次のセクションを参照して下さい。

ここで、FORTRAN関数に必要なはずの仮引数が、IF/Prologとの間で暗黙に受渡しされるパラメターに置き換えられていることに注意して下さい。

以下にプログラム例を挙げます。

!------------------------------------------------------------------

FUNCTION CBOOT CBOOT = IFCPRIM('idplus',3,IDPLUS) RETURN

FUNCTION IDPLUS INTEGER*4 N REAL*8 R,IFDBLPC N=IFINTPC(IFARG(1)) R=IFDBLPC(IFARG(2)) IDPLUS=IFUNIFYARC(3,IFDBLCP(N+R)) RETURN END

!------------------------------------------------------------------

注 IFDBLPC関数は、整数ではなく倍精度浮動小数を返しますので、REAL*8として宣言されなければなりません。(明示的に宣言しないと整数として宣言されてしまいます)

ステップ 6: `IFXCHK'と`IFXCHKNOT'を使用して、IF/Prologから渡されたIF/Prologライブラリの関数コールをテストし、例外処理することが可能です。

ステップ 7: すでに説明したように、述語が成功したかどうかをIF/Prologに知らせるため、FORTRAN関数はリターン値を返さなければなりません。

リターン値が1ならばこの関数が成功したことを示し、0なら失敗で例外処理のためのチェックが行なわれます。

それでは、これまで述べてきた小さな例題の完全なプログラムを示します。

!------------------------------------------------------------------

FUNCTION CBOOT CBOOT = IFCPRIM('idplus',3,IDPLUS) RETURN

FUNCTION IDPLUS INTEGER*4 N REAL*8 R,IFDBLPC IF (IFXCHK(IFISINT(IFARG(1)),'integer expected').EQ.0 GO TO 100 IF (IFXCHK(IFISDBL(IFARG(2)),'double expected').EQ.0) GO TO 100 N=IFINTPC(IFARG(1)) R=IFDBLPC(IFARG(2)) IDPLUS=IFUNIFYARC(3,IFDBLCP(N+R)) RETURN 100 IDPLUS=0 RETURN END

!------------------------------------------------------------------

ステップ 8: ここで、FORTRAN関数を含むあなたのファイル`newpreds.for'をコンパイルし、IF/Prologオブジェト・ライブラリにリンクしてください。

新しいIF/Prologを生成するために、標準の`C'ランタイム・ライブラリと`C-Curses'ライブラリが必要です。これらはともにリンク・ライブラリとして定義されねばなりません。

$ fortran newpreds.for

$ define lnk$library sys$library.vaxcrtl.olb $ define lnk$library sys$library.varxccurse.olb

$ link proroot:[c]main,newpreds, proroot:[c]ifprolog/library

$ newpro*log=="$ main.exe"

ステップ 9: 新しい組み込み述語を一度試してみましょう。以下のようにタイプして、新しく生成されたPrologを起動します。

$ newprolog

?- idplus(10,2.59,Res). Res=12.59

yes

?-

document: http://www.ifcomputer.co.jp/IFProlog/Manuals/v4.1/advanced_feature/fortran/intro/write/print_jp.html
published 2008/12/1 update 1994/8/24 (c) 1996-2006 IF Computer Japan
IF Computer 〒113-0022 Tel 03-5814-3352 start (AT) ifcomputer.com
Customer Support 東京都文京区千駄木5-28-2   http://www.ifcomputer.co.jp
戻る> managed with ubiCMS