JPS63159936A - 論理型言語プログラムのコンパイル方法 - Google Patents

論理型言語プログラムのコンパイル方法

Info

Publication number
JPS63159936A
JPS63159936A JP30641486A JP30641486A JPS63159936A JP S63159936 A JPS63159936 A JP S63159936A JP 30641486 A JP30641486 A JP 30641486A JP 30641486 A JP30641486 A JP 30641486A JP S63159936 A JPS63159936 A JP S63159936A
Authority
JP
Japan
Prior art keywords
program
array data
data
procedure
section
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP30641486A
Other languages
English (en)
Inventor
Yasushi Kaneda
泰 金田
Shunichi Torii
俊一 鳥居
Keiji Kojima
啓二 小島
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP30641486A priority Critical patent/JPS63159936A/ja
Publication of JPS63159936A publication Critical patent/JPS63159936A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】本公報は電子出願前の出願データであるた
め要約のデータは記録されません。

Description

【発明の詳細な説明】 〔産業上の利用分野〕 本発明は、Prologで代表される電子計算機用論理
型言語で記述されたプログラムのコンパイル方式にかか
わり、パイプライン型ベクトル計算機または並列型ベク
トル計算機による人工知能プログラムの高速実行を目的
とする。
〔従来の技術〕
最初に、論理型言語によるプログラムの表現についての
べる。
論理型言語においては、述語論理における命題(論理型
言語においてはr節」とよぶ)をつぎのような形式で記
述する。
bird (swallow)、          
 −=■fly(X)ニーbird(X)、     
   −−■節■「ツバメは鳥であるjという意味であ
る。
また1節■は「Xが鳥ならXは空をとぶ」という意味で
ある。節の先頭の名前(■においてはbird、■にお
いてはfly )を手続き名または述語名という、同一
の述語名をもつ節の集合を「手続き」または「述語」と
いう、プログラムが節■および節■だけからなっている
とすれば、節■および節■はそれぞれ単独でひとつの手
続きを構成する。
大文字ではじまる名前(この例ではXがそれにあたる」
は「論理変数」とよばれ、不特定のものをあられす、そ
れに対して小文字ではじまる名前 1(この例ではsw
allowがそれにあたる)は「定数」とよばれ、特定
のものあるいは数をあられす、論理変数はFortra
nなとのプログラム言語における変数とはちがって、い
ったん値がきまると「失敗」がおこらないかぎりその値
を変更することができない、すなおち1通常の意味での
代入をおこなうことはできない。
■および■がプログラムとして論理型言語システムにあ
たえられているとき、つぎの■のような質問を発するも
のとする。「質問」はFortran言語における主プ
ログラムに相当する。
? −fly(swallow)、         
 −−■その結果は[真」となる、ここで質問■は「ツ
バメは空をとぶか?」という意味である。
また、プログラム■はつぎのようにつかうこともできる
? −fly(Y)、’              
・・・・・・■その結果、Y =swallovという
解かえられる。
ここで質問■は[空をとぶものはなにか?」という意味
である。すなわち、Yは論理変数であり、これにあては
まるものはなんであるかを質問している。そして、fl
y(swallow)は「ツバメは空をとぶ」あるいは
「空をとぶのはツバメであるJという意味である。
質問■を構成しているfly(swallow)および
質問■を構成しているny(y)を手続きflyの「手
続きよびだし」とよぶ、同様に、節■にあられれるbi
rd (X )は手続きbirdの手続きよびだしであ
る。
手続きよびだしはFortran言語におけるサブルー
ティンよびだしに相当する。
同一のプログラムが質問■および■のように入力と出力
をとりかえても動作するという性質を「双方向性」とよ
ぶ(flyの引数は質問■においては入力であり、質問
■では出力である)、双方向性は論理型言語プログラム
の特徴的な性質のひとつである。
また、上記の■および■にくわえてつぎの■のプログラ
ムを記述すると、質問■の解はY=swallowとY
=hanのふたとおりになる(この場合、手続きbir
dは2個の節から構成されることになる。) bird (hen)、              
・= ・−■このように複数の解が存在する場合がある
ということも、論理型言語プログラムの特徴的な性質の
ひとつである。
質問? −fly(Y )の実行前には論理変数又は不
特定のものをあわしているが、実行中にはswallo
wという定数とむすびつけられている。このように論理
変数が特定のものをあられしていることを「具体化され
ている」といい、特定のものをあらわしていないことを
「具体化されていない」という。
つづいて、論理型言語の逐次実行方式についてのべる。
例として第2図のプログラム200を使用する。
まずプログラム200の意味を説明する0節201〜2
05はそれぞれつぎのような意味である。
節201 「ペンギンは鳥である」。
節202 「ツバメは烏である」。
節203 「ニワトリは鳥である」。
節204 「ペンギンは空をとべない」。
節205 [ニワトリは空をとべない」。
節2019節202および節203が手続きbirdを
構成し、節204および節205が手続きcannot
Flyを構成している。
また、質問206はつぎのような意味である。
「鳥であって空をとべないものをすべて出力せよ」。
より正確にいうと、rbird(X)およびeanno
tFly(X)をみたす論理変数X値をさがして出力す
るという動作をすべての解についておこない、別解がな
くなったら結果を「偽」とせよ」という意味である。質
問206は4つの手続きよびだしbird(X)、 c
annotFly(X)e write(X)、 fa
ilから構成されている。
第3図は質問206の逐次実行方式を記述した図である
。この図をつかって論理型言語の逐次実行方式を例説す
る。まず論理変数Xが具体化されていない状態で手続き
よびだしbird301が実行される。 bird(X
)にマツチ(ユニファイ)する節は201〜203の3
個あるが、そのうち最初にあられれる節201が選択さ
れる。その結果、論理変数又はpenguinに具体化
される。つぎに手続きよびだしcannotFly 3
02 が実行される。論理変数Xはpenguinに具
体化されているので、節204〜205のうちで節20
4だけがマツチする。それから手続きよびだしwrit
e303 が実行される。論理変数Xは定数pengu
inに具体化されているので、ひとつの解’pengu
in’  が出力装置に表示される。さらに手続きよび
だしfail304が実行される。
手続きfailは「別解をさかせ」という意味の手続き
なので、まず手続きよびだしCannotFlyに関し
て別解をさがす。この動作を1手続きcannotFl
yをrリトライする」という、この場合、Xが定数pe
nguinに具体化されているかぎり別解は存在しない
ので、リトライによってcannotFlyは引数Xに
結果をかえさない、したがって、論理変数Xの値を30
1以前の状態にもどす、すなわち具体化されていない状
態にしてから1手続きbirdをリトライする(305
)、すなわち、手続きよびだしbirdに関して別解を
さがす、このように論理変数の値をもとにもどして手続
きよびだしを再実行することをrバックトラック」とい
う、処理305の結果、解がみつかり、論理変数Xは定
数swallowに具体化される。つぎに手続きよびだ
しCann0tFly306が実行される。論理変数X
は定数swallowに具体化されているので、節20
4〜205のなかにはマツチするものがない。したがっ
て実行は失敗し、ふたたびXの値を具体化されていな状
態にしてから手続きよびだしbirdを再度リトライす
る(307)。
307〜320の実行は301〜304の実行と同様に
おこなわれるので説明は省略する。最後にふたたびXの
値を具体化されていない状態にしてから手続きbird
をリトライする(311)、L/かし、もはや別解は存
在しないので質問206の結果はr偽jとされて実行が
終了する。
以上のように逐次的に実行されるプログラムを生成する
コンパイル方式については、たとえばつぎの文献(1)
に記述されている。゛ 文献(1)インプリメンティング プロログーーコンパ
イリング プレデイケイト ロジックプログラムズ、エ
ディンバラ大学人工知能学部 ディー・エイ・アイ リ
サーチ レポート 第39号(Implementin
g PROLOG −−CompHing Predi
cate Logic Programs、D。
^、1.Ra5aarch Report Na 39
 、Departmentof Artificial
 Intelligence、Universityo
f E!dinburgh) * 特願昭59−186321号(1984,9、7出願)
でのべられているように、論理型言語の実行を飛躍的に
高速化するための有力な方法として、パイプライン型ベ
クトル計算機あるいは並列型ベクトル計算機がもつ高速
ベクトル演算機構を使用する方法がある。ここで「ベク
トル演算」とは、ベクトルすなわち同種の複数の要素か
らなるデータの各要素に対して同種の演算をおこなうこ
とをいう0通常、ベクトル演算では要素を一定間隔で連
続領域に配置したデータ構造(いわゆる配列)を演算対
象とするが、ここではリストの各要素に対して同種の演
算をおこなうこともベクトル演算とよぶ、そして、「ベ
クトル計算機」とはベクトル演算命令をもつ計算機のこ
とをいう。
ベクトル計算機の例としては日立製作所のS−810な
どがある。第4図を使用してS−810の演算装置につ
いて説明する。S−810においては、第4図にしめず
ようなパイプライン機構によって、配列データの演算高
速に実行することができる。たとえば、主記憶装置42
1上にある配列データ401にふくまれる各データをロ
ード・パイプライン402によって連続的にベクトル・
レジスタ403にロードする。ロード・パイプラインと
は、短ピツチで配列データ全体(または一部)をロード
することができる。配列データ計算専用のハードウェア
である。また、ベクトル・レジスタとは配列データ全体
(または一部)の値を保持することができる大容量のレ
ジスタである。
401〜403と同様にして配列データ403にふくま
れるデータをロード・パイプライン405によってベク
トル・レジスタ406にロードする。
ベクトル・レジスタは、最初の要素がかきこまれるとた
だちにそのよみだしが可能になる。したがって、ベクト
ル・レジスタ403および406に最初のデータがかき
こまれるとただちに演算装e407によって演算が開始
され、連続的に演算が実行される。そして、演算結果は
ベクトル・レジスタ408にかきこまれていく、演算装
置も配列演算専用につくられたパイプライン演算装置で
あり、ベクトル・レジスタ403および406とおなじ
ピッチで演算することができる。ベクトル・レジスタ4
08に最初のデータががきこまれるとただちにストア・
パイプライン409によって配列データ410^の格納
が開始され、連続的に格納されていく。
このように、ベクトル計算機においては配列データのロ
ード、演算、格納がパイプラインによっておこなわれる
ため、配列データに関しては汎用計算機にくらべてはる
かに高速な配列演算が可能になっている。
ベクトル計算機による論理型言語プログラムの実行方式
については、前述の特許出願およびっぎの文献(2)で
のべている。
文献(2)スーパー・コンピュータによるProlog
の高速実行、第26回プログラミング・シンポジウム報
告集第47頁から第56頁。
1985年。
の例をベクトル計算機で実行する方法について第5図を
つかってのべる。
第5図は、ベクトル計算機による第2図のプログラムの
実行方式を記述した図である6手続きよびだしbird
501は、手続きbirdをみたすすべての解をもとめ
てそれらからなる配列データを502とする。すなわち
第3図301,305,307および311に対応する
処理をベクトル演算としておこない、その結果えられる
Xの値を配列データ502とする。したがって配列デー
タ502は、penguin、 swallow、 h
enという3個の定数からなる配列データとなる。配列
データ502の先頭にはその要素数3が格納されている
各配列データの先頭にはその要素数を格納する6また。
要素数データは配列の要素とはみなさない、たとえば、
配列データ502の第1要素は3ではなく pengu
inであり、第2要素はswalloす、第3要素はh
enである。このことは後に述べる実施例でも同様であ
る。
手続きよびだしcannotFly503 は配列デー
タ502を入力して、その要素のうちで手続きcann
otFlyをみたすすべての解をもとめてそれらからな
る配列データを504とする。すなわち、配列データ5
02の要素penguinに対しては第3図302、s
wallowに対しては第3図306゜henに対して
は第3図308に対応する処理をベクトル演算としてお
こなうことによって、cannotFly(X)をみた
すXがpenguin、 henの2個であることを判
定し、それらからなる配列データ504をもとめる。し
たがって、配列データ504はpenguin、 he
nという2個の定数からなる配列データとなる。
手続きよびだしwrite 504 は配列データ50
4を入力して、その要素すべてを出力装置に表示する。
すなわち、第3図303および309に対応する処理を
おこなう、したがって、出力装置にpenguinおよ
びhenを表示する。
最後に手続きよびだし506を実行するが。
bird 501 、 cannotFly 503 
ではすべての解がもとめられているので、質問201の
結果は「偽Jとされて実行が終了する。
〔発明が解決しようとする問題点〕
まず、問題点を説明する前に第6図のプログラム600
について説明する。
プログラム600は0から3までの整数のうち平方数で
あるものをもとめるプログラムである。
平方数とは平方根が整数である数のことである。
0=O” 、1=1” でtbるから、 解jtOと1
の2つである。第6図のプログラムは質問601、手続
きroot602.手続きdigit603  という
3個の部分から構成されている。
質問601は手続きroot 602および手続きdi
git 603  をよびだすことによって平方数を計
算し、それを印刷する。質問601はさらにdigit
(B) 、 root(B、A) 、 write(B
) 、failという4つの部分から構成されている。
 digit(B)は論理変数Bを引数として手続きd
igitをよびだす部分である。 root(B、A)
は論理変数BおよびAを引数として手続きrootをよ
びだす部分である。
write(B )は論理変数Bの値を印刷するために
くみこみ手続きwriteをよびだす部分である。ここ
で、くみこみ手続きとは論理型言語システムにあらかじ
め用意されていて、ユーザがその処理方法をあたえなく
ても使用することができる手続きのことである。 fa
ilもくみこみ手続きであり、すべての解がつくされる
までroot(B、A)およびdigit(B)をリト
ライし、digit(B) 、 root(B、A) 
write(B )をくりかえし実行させる。
手続きroot 602は唯一の節から構成されている
0節602は頭部root(Y*X)、本体digit
(XLYisX串X、そしてそれらをつなぐニーとから
構成されている0頭部は手続き名と引数とをしめしてい
る。すなわち手続きroot602は引数YおよびXを
うけとる。質問601におけるrootのよびだしでは
Y=B、X=Aである0手続きroot602(IF)
本体はdigit(X)およびYisX*Xという2つ
の部分から構成されている。 digit(X)は論理
変数Xを引数として手続きdigitをよびだす部分で
あるs Y is X ” Xは論理変数Xの値を2乗
してYと比較するくみこみ手続きである。これらのうち
digit (X )は質問601の手続きよびだしf
ailによってひきおこされる手続きrootのリトラ
イ時にリトライされ、ことなる引数の値を出力する。
手続きdigit603 は4個の節から構成されてい
る。第1節digit(1)を実行するとdigitの
よびだしにおける引数の値を1にする。第2〜4節も同
様である1以上で第6図のプログラム600についての
説明をおわる。
つぎに、第6図のプログラム600を従来の技術によっ
てベクトル計算機で実行させようとする場合の問題点に
ついて、第2図のプログラム200の場合と対比しなが
ら説明する。
第2図のプログラム200においては1手続きblrd
がよびだしおよびリトライごとにことなる引数を出力す
るために1手続きよびだしcannotFly(X)は
複数回(N回)よびだされる、しかし、手続きcann
otFlyのリトライが成功してその引数に値がかえさ
れることはない(よびだし時には。
成功して引数に値がかえされる場合と、そうでない場合
とがある)、そのため、第5図の実行方式においては、
 blrd501の実行によって論理変数Xに対応する
配列データとして複数個の値すなわちpenguin、
 swallowおよびhenからなる配列データ50
2があたえられたあとは、その要素penguinおよ
びhenからはそれぞれ1個の解、swallowから
は0個の解がえられる結果として、配列データ504が
えられる。このように演算前の配列要素が演算後の1個
または0個の配列要素と対応する場合には前述の特許出
願にしめした方法であつかうことができる。すなわち、
S−810等のベクトル計算機にそなえられたベクトル
演算命令をくみあわせることによって容易に実施するこ
とができる。。
しかし、第6図のプログラム600においてはそうでは
ない0手続きよびだしdigit (Y )がよびだし
およびリトライごとにことなる引数データを出力するた
めに、手続きよびだしdigit (X )は複数回(
N回)よびだされる、それによって、プログラム200
とはちがってよびだしおよびリトライごとにことなる引
数データが出力される。そのため、演算前の論理変数Y
の値を要素とする配列データを第2の配列データとし、
演算後の引数データXの値を要素とする配列データを第
1の配列データとすると、これらの要素は対応しない、
ところが、既存のベクトル計算機には、このような対応
しない要素どうしの演算をおこなうベクトル演算命令は
存在しない、したがって、プログラム600は前述の特
許出願の方法ではあつかうことができない、前述の文献
(2)においては、このように配列データのひとつの要
素から複数の配列要素が生成される例として、Nクウイ
ーン問題とよばれるパズルをとくプログラムにおける手
続き5electをあげ、その入力データおよび出力デ
ータについて説明している。しかし、その計算を実行す
るプログラムはあたえていない。
〔問題点を解決するための手段〕
上記の問題点は、論理型言語の原始プログラムを目的プ
ログラムに変換するコンパイラにおいて、1 、(1)
よびだしまたはリトライによって実行され、実行ごとに
ことなる所定の第1の処理をおこなって引数データを出
力するようにプログラムされた第1の原始プログラム部
分と、(2)(イ)第1の原始プログラム部分のよびだ
しおよび複数回のリトライを指示し、(ロ)よびだしお
よびリトライによって第1の原始プログラム部分から出
力された複数の引数データに対して所定の第2の処理を
実行し、(ハ)該ステップ(イ)、(ロ)をN回くりか
えし実行するようにプログラムされた第2の原始プログ
ラム部分と からなるプログラムを。
(3) (a)第1の処理のそれぞれを入力データで指
定された回数すなわちN回分まとめて連続的に実行し、
(b)それらの処理によってえられる引数データのそれ
ぞれの値を要素とする第1の配列データを生成して出力
する第1の目的プログラム部分と、 (4)(c) <りかえし回数Nを指定して第1の目的
プログラム部分を実行させ、(d)第1の目的プログラ
ム部分によって出力された第1の配列データの各要素に
対する第2の処理を連続的に実行する第2の目的プログ
ラム部分と に変換することにより解決される。
〔実施例〕
(1)ベクトル比較命令およびベクトル圧縮命令の説明 実行方法の説明の準備として、実行時に使用するベクト
ル演算命令の一種であるベクトル等値性比較命令とベク
トル圧縮命令について説明する。
第7図はベクトル等値性比較命令の動作をしめす、ベク
トル等値性比較命令はそのオペランドで指定されたベク
トル・レジスタ801にふくまれる配列データ801お
よび802の各要素を比較して、結果をベクトル・マス
ク・レジスタ803に格納する。ベクトル・マスク・レ
ジスタは各要素が1 bitの論理値である配列データ
を格納するレジスタである。第7図ではその論理値を1
およびOであられしている。比較の結果ひとしかった要
素に対応するベクトル・マスク・レジスタ803の要素
の値は1とし、ひとしくなかった要素に対応する要素は
Oとする。第7図においてはベクトル・レジスタ801
および802の第1要素の値がともに1であるため、ベ
クトル・マスク・レジスタ803の第1要素の値は1と
なっている。また、ベクトル・レジスタ801および8
02の第2要素は6および4でひとしくないので、ベク
トル・マスク・レジスタ803の第2要素の値はOとな
っている。第3〜最終要素についても同様である。
ベクトル計算機S−810には、ベクトル等値性比較命
令VCEQがそなえられている。
第8図はベクトル圧縮命令の動作をしめす、ベクトル圧
縮命令はそのオペランドで指定されたベクトル・レジス
タ901の値を、ベクトル・マスク・レジスタ902の
内容にしたがって、主記憶421またはベクトル・レジ
スタ903に圧縮・格納する命令である。第8図におい
てはベクトル・マスク・レジスタ902の第1要素の値
が1であるから、ベクトル・レジスタ901の第1要素
の値を主記憶421またはベクトル・レジスタ903に
格納する。ベクトル・マスク・レジスタ902の第2要
素の値はOなのでベクトル・レジスタ901の第2要素
の値は格納しない、ベクトル・マスク・レジスタ902
の第3要素の値は1であるから、ベクトル・レジスタ9
01の第3要素の値は格納するがその際1図のようにつ
めて格納する。すなわち、主記憶421またはベクトル
・レジスタ903の第2要素に対応する部分に格納する
。以下の要素についても同様である。
ベクトル計算機S−810においては主記憶421への
格納をおこなうベクトル圧縮命令VSTC,VSTDC
がそなえられている。
(2)目的プログラム コンパイラは後述する方法により第6図のプログラム6
00を第1図の目的プログラム100に変換する。コン
パイルは汎用計算機上でおこなえばよい。
まず、第1図にしめした目的プログラム100の構成に
ついて説明する。目的プログラム100はつぎの3つの
部分で構成される。
(1)質問601のコンパイル結果である質問の目的プ
ログラム101゜ (2)手続きroot 602のコンパイル結果である
手続きrootの目的プログラム102゜(3)手続き
digit 603 のコンパイル結果である手続きd
lgltの目的プログラム103゜これらのうち計算中
に演算前の配列データのひとつの要素から複数の配列要
素が生成されるのは手続きdigltだけである。10
1〜103の各部分はそれぞれさらにつぎの各部分から
構成されている。
(1)、質問601のコンパイル結果である質問の目的
プログラム101゜ (1,1)第6図の論理型言語プログラムには直接対応
する部分のない質問初期設定部109゜(1,2) 1
間601における手続きよびだしdigit (B )
のコンパイル結果であるdigit(B)よびだし部1
10゜ (1,3)質問601における手続きよびだしroot
(B、A)のコンパイル結果であるroot(B、A)
よびだし部111゜ (1,4)質問601におけるくみこみ手続き%1ri
taのコンパイル結果である質問くみこみ手続き処理部
112゜ (2)手続きroot602のコンパイル結果である手
続きrootの目的プログラム102゜(2,1)第6
図の論理型言語プログラムには直接対応する部分のない
root初期設定部114゜(2,2)手続きroot
 602本体における手続きよびだしdigit (X
 )のコンパイル結果であるdigit (X )よび
だし部115゜(2,3)手続きroot 602本体
におけるくみこみ手続きYisX*Xのコンパイル結果
であるroot <みこみ手続き処理部116゜なお、
仮引数にリストなどの構造体パタンをふくむ論理型言語
プログラムのコンパイルにおいては、115〜116の
ほかに引数のバタン・マツチをおこなう引数ユニフィケ
ーション処理部が必要だが、第6図のプログラムにおい
ては仮引数(節602の頭部にあられれるy、x)は論
理変数なので、引数ユニフィケーション処理部は必要が
ない、引数ユニフィケーション処環部はくみこみ手続き
処理部116と同様のあつかいとすればよいので、それ
をふくむ実施例はしめさない。
(3)手続きdigit 603 のコンパイル結果で
ある手続きdigitの目的プログラム103゜(3,
1)第6図の論理型言語プログラムには直接対応する部
分のないdigit初期設定部119゜ (3,2)主記憶421上のデータを節の数だけ、複写
する複写部120゜ (3,3)手続きdigit 603 の第1節に対応
する第1節対応部121、第2節に対応する第2節対応
部122、第3節に対応する第3節対応部123および
第4節に対応する第4節対応部124゜ (3,4)複写部120で複写された配列データをそれ
ぞれ併合する併合部125゜ (3) 目的プログラム100の実行手順つぎに、第1
図の目的プログラム100の実行手順を第9A〜9G図
をつかって説明す為。
まず、質問初期設定部109が実行され、1001にし
めすデータが生成される。すなわち、質問の目的プログ
ラム101内で使用するすべての変数データ領域すなわ
ち変数Aに対応する配列データのポインタ領域102O
Aおよび論理変数Bに対応する配列データのポインタ領
域1020Bを主記憶421にわりあてる。また、要素
が1個の配列データ領域1021および配列データ領域
1022を主記憶421にわりあて、それらの先頭アド
レスを変数領域1020に格納する。配列データ領域1
021の先頭1023にはその要素数1を格納する。配
列データ領域1022についても同様である。また、配
列データ1021および1022の要素には、その値が
未定であることをしめす値°u′を格納する。
つぎに、digit(B )よびだし部110およびよ
びだされた手続きdigitの目的プログラム103の
処理をおこなう、すなわち、配列データ・ポインタ10
20Bを引数として手続きdigitの目的プログラム
103を起動し、実行する。その結果1002にしめす
データが生成される。この一連の処理は1003〜10
06にしめすdigit (X )よびだしの処理と同
様におこなわれるので、詳細は省略する。結果として出
力されるデータはつぎのとおりである。ポインタ領域1
020A。
1020Bから1手続きdigit内で主記憶421に
わりあてられた要素が4個の配列データ1024および
1025を指示している。配列データ1024はその先
頭に要素数4をふくみ、要素の値はすべて′u′である
。すなわち、要素の値はすべて未定である。また、配列
データ1025はその先頭に要素数4をふくみ、要素の
値は1.2,3.Oである。
つづいて、root(B、A)よびだし部111の処理
をおこなう、すなわち、配列データ・ポインタ1020
B、1020Aを引数として手続きrootの目的プロ
グラム102をよびだす。手続きrootの目的プログ
ラム102の実行が開始されると、まずroot初期設
定部112を実行し、その後digit(X)よびだし
部115を実行する。 digit(X)よびだし部1
15の実行が開始されると、まずdigit初期設定部
119を実行する。これらの一連の処理をおこなったの
ちの主記憶421上のデータは1003にしめしたよう
になる。1003においては、1002にしめしたデー
タはそのまま存在し、それにくわえて1031および1
o32が存在する。1032はroot初期設定部11
4でねりあられたポインタ領域であり、1031はdi
git初期設定部119でわりあてられたポインタ領域
である。
複写部120の処理はっぎのとおりである。主記憶42
1上に存在する一連のデータ1020゜1031.10
32,1024を複写して、構造が同一である4組のデ
ータをつくる。すなわち、もとの手続きdigit 6
 Q 3における節の数だけの複写データをつくる。そ
の結果をしめしたのが1004である。複写データのう
ちの最初の組はもとのデータ1070であり、2番めの
組は1o71である。また、3番めの組は1072であ
る。さらに、4番めの組は1073である。この複写処
理はつぎのようにおこなわれる。主記憶421上に配列
データ1024と同一のおおきさの領域を3つすなわち
1036,1040,1044をとり、そこに配列デー
タ1024の内容を複写する。
また、1020.1032および1031と同一のおお
きさの領域をそれぞれ3つとる。すなわち、1033.
1037,1041,1034,1038゜1042.
1035,1039.1043をわりあてる。これらの
領域には、1004にしめしたように1035.104
0および1044の先頭アドレスを格納する。配列デー
タ1025も同様に4組複写し、配列データ1080.
1081および1082を生成する。
複写部120の実行がおわると、第1節対応部121、
第2節対応部122.第3節対応部123、第4節対応
部124を実行する。これらの実行順序は任意であり、
並列に実行することもできるが、この実施例においては
この順に実行する。121〜124の実行後の主記憶4
21上のデータを1005にしめす、第1節対応部12
1はこれらのデータのうち1004における第1の複数
1070を入力し、1005におけるそれを出力する。
第2筋対応部122はこれらの複写データのうち100
4における第2の複写データ1071を入力し、100
5におけるそれを出力する。第3節対応部123はこれ
らの複写データのうち1004における第3の複写デー
タ1072を入力し、1005におけるそれを出力する
。第4節対応部124はこれらの複写データのうち10
04における第4の複写データ1073を入力し、10
05におけるそれを出力する。配列データ1025,1
080゜1081および1082は121〜124の実
行によって変化しない。
第1節対応部121の処理はつぎのとおりである1手続
きdigit 603 の引数に対応する領域1031
が指示する配列データの各要素に1を格納する。第2節
対応部122、第3節対応部123゜第4節対応部12
4も同様におこなわれる。すなわち、それぞれ1033
,1037,1041が指示する配列データ1036,
1040,1044の各要素に2.3.Oを格納する。
これらの演算は汎用の命令を使用しておこなうこともで
きるが。
ベクトル演算命令を使用することによってより高速にお
ζなうことができる。
併合部125では配列データ1024,1036゜10
40および1044の併合処理と配列データ1025.
1080,1081.1082の併合処理とをおこなう
、配列データ1024の併合処理はつぎのとおりである
。配列データ1024゜10.36,1040および1
044の要素数を加算し、その結果すなわち16を要素
数とする配列データ領域1046を主記憶421上にわ
りあてる。配列データ1024,1038.1040お
よび1044の要素数はそれらの先頭領域に格納されて
いる。配列データ1046の第1〜4要素の値は配列デ
ータ1024の各要素の値とひとしくシ、第5〜8要素
の値は配列データ1036の各要素の値とひとしくシ、
第9〜12要素の値は配列データ1040の各要素の値
とひとしく、第13〜16要素の値は配列データ104
4の各要素の値とひとしくする。これらの併合処理は汎
用の命令を使用しておこなうこともできるが、ベクトル
演算命令を使用することによってより高速におこなうこ
とができる。
配列データ1025,1080,1081゜1082の
併合処理も同様におこない、すなわち1003における
配列データ1025とそれを複写した3個の複写データ
1080,1081゜1082を併合して要素が16個
の配列データ1047をつくる。1006には配列デー
タ1046および1047の値が一部だけをしめしてい
るが。
1007にはそのすべての値をしめしている。
併合部125の実行がおわると、diglを終了処理部
126をへて手続きrootの目的プログラム102に
復帰し、 root<みこみ手続き処理部116を実行
する。root<みこみ手続き処理部116の計算はベ
クトル演算命令を使用しておこなう。
1007〜1009はroot <みこみ手続き処理部
116におけるベクトル演算の過程におけるデータをあ
られす、1050.1051および1053はベクトル
・レジスタをあられす、1054はベクトル・マスク・
レジスタをあられす、1055および1056は主記憶
421上の領域をあられす。
root <みこみ手続き処理部116ではまず配列デ
ータ1046の内容を1個のベクトル・レジスタ105
0にロードする。ただし、配列データ1050の先頭に
格納されている要素数はロードしない、1050には配
列データ1046のすべての値をしめしである。同様に
して配列データ10.47の内容をベクトル・レジスタ
1051にロードする。
つぎにベクトル・レジスタ1050の各要素を2乗して
えられた配列データをベクトル・レジスタ1053に格
納する。たとえば、ベクトル・レジスタ1050の第4
要素は2であるから、ベクトル俸レジスタ1053の第
4要素は2” =4となる。さらに、ベクトル・レジス
タ1051と1053の各要素を比較し、その結果をベ
クトル・マスク・レジスタ1054に格納する。この比
較は第7図を使用して説明したベクトル等値性比較命令
によっておこなう、ベクトル・レジスタ1051と10
53の各要素は、第1要素どうしと第16要素どうしが
ひとしく、ほかの要素はことなるのでベクトル・マスク
・レジスタ1054の要素は第1要素と第16要素とが
1、ほかの要素は0となる。
さらに、ベクトル・マスク・レジスタ1054の内容に
したがってベクトル・レジスタ1050および1051
の内容を圧縮し、それぞれ、あらたにわりあてた主記憶
421上の領域1055および1056に格納する。す
なわち、ベクトル・マスク・レジスタ1054の1であ
る第1.第16要素に対応するベクトル・レジスタ10
50の要素1および0を1055に格納する。同様にベ
クトル・レジスタ1051の第1要i1.第16要素O
を主記憶421上の領域1056に格納する。この圧縮
処理はベクトル圧縮命令を使用しておこなうことができ
る。
root (みこみ手続き処理部116の最後の処理を
おこなったあとの主記憶421上のデータを1010に
しめす、この処理においては、主記憶領域1055およ
び1056の先頭にその要素数2を格納するとともに、
その先頭アドレスを102OA、1020B、1031
X、10:31Yに格納する。
以上の処理のあと、root終了処理117をへて質問
の目的プログラムに復帰し、質問くみこみ手続き処理部
112において1020Bが指示する配列データ104
6の各要素すなわち1および0を印字出力する。その後
、実行を終了する。
(4)コンパイル方法 第6図の論理型言語プログラムを第1図の目的プログラ
ムに変換するコンパイル方法について。
第11図を使用して説明する。
コンパイラは、1100にしめすように1手続きごとに
くりかえし処理をおこなう、その際、質問も1つの手続
きとみなす、第6図のプログラムの場合は、質問601
1手続きroot602、手続きdigit 603 
のそれぞれについて1101〜1106の処理をおこな
う。
まず、初期設定部を生成する。すなわち、質問601に
対しては質問初期設定部109、手続きroot602
に対してはroot初期設定部114、手続きdigl
t 603 に対してはdigit初期設定部119を
生成する。
つぎに、変換前の手続きがリトライによって引数データ
を出力する(リトライが成功する)可能性があるかどう
かを判定する解散判定処理1102をおこなう、この処
理の内容については第11図でさらに説明する。処理1
102の判定においてリトライによって引数データを出
力しない判定された場合は処理1103だけをおこない
、そうでない場合は処理1104,1103.1106
をこの順におこなう。
手続きdigit 603  に対しては処理1104
゜1103.1106が実行される。処理1104では
複写部120を生成する。また、処理1105では手続
きdigit 603 の第1〜4節対応部121〜1
24を生成する。さらに、処理1106では併合部12
5を生成する。一方、質問および手続きroot 60
2に対しては処理1103が実行される。質問601に
対しては質問第1節対応部140を生成する。また、手
続き602に対してはroot第1節対応部141を生
成する。質問第1節対応部140はさらにプログラム部
分110〜112から構成され、root第1節対応部
141はプログラム部分115〜116から構成される
が、これらの部分の生成については第12図で説明する
以上で第1図のプログラム100のすべての部分の生成
をおわり、コンパイルは終了する。
つづいて第11図をもちいて解散判定処理1102につ
いて説明する。まず、処理中のプログラムが質問かどう
かを判定しく処理1201)、質問であれば解散判定処
理1102の結果をNoとする。
質問でなければ、処理中の手続きが複数の節から構成さ
れているかどうかをしらべ、そうであれば解散判定処理
1102の結果をYesとする。また、そうでなければ
結果をNoとする0手続きroot 602について解
散判定処理1102をおこなうと、手続きrootはた
だ1つの節から構成されているので、結果はNoとなる
0手続きdigit603は複数の節から構成されてい
るので、結果はYesとなる。
この判定方法では、実際にはリトライによって引数デー
タを出力する(リトライが成功する)ことがないのに結
果がYesとなることがある。この場合、不要な複写部
および併合部が生成され、実行時に不要な複写処理およ
び併合処理がおこなわれることになるが、実行結果はか
わらない。
最後に第12図をつかって第1〜n節対応部生成処理1
103について説明する。処理1103では処理中の手
続きのすべての節についてつぎにのべる処理1301を
節の順番にくりかえし実行する。第6図のプログラム6
00においては質問601、手続きroot 602の
唯一の節、手続きdlgit 803 の各節のそれぞ
れについて処理1301を実行する。
処理1301では処理中の節のすべての手続きよびだし
についてつぎにのべる処理1302〜1304を順番に
くりかえし実行する。プログラム600の場合には、質
問601についてはdigit(B) 、 root(
B、A) # write(B) t failのそれ
ぞれについて処理1302〜1304を実行する。また
、手続きroot602の唯一の節についてはdigi
t(X) 、 Y is X傘Xのそれぞれにツレ1て
処理1302〜1304を実行する0手続きdigit
 603 は手続きよびだしふくまないので。
処理1302〜1304は実行しない。
処理1302は処理中の手続きよびだしかくみこみ手続
きのよびたしかどうかを判定する。プログラム600の
場合には、write(B)、 fail、 YisX
傘X はそれぞれくみこみ手続きのよびだしだと判定さ
れる。また、digit(B)、 root(B*A)
+digit(X)はそれぞれくみこみ手続きではない
と判定される。
処理1302においてくみこみ手続きと判定された場合
は、処理1303を実行する。すなわち。
処理中のくみこみ手続きに対応する目的プログラム部分
を生成する。プログラム600の場合には。
write(B )については質問くみこみ手続き処理
部112を生成する。また、failについてはなにも
生成しない(空の目的プログラム部分を生成する)。
さらに、YjsX*Xにつし1てはroot (みこみ
手続き処理部116を生成する。
処理1302においてくみこみ手続きではないと判定さ
れた場合は、処理1304を実行する。
すなわち、処理中の手続きよびだしに対応する目的プロ
グラムを起動する目的プログラム部分を生成する。プロ
グラム600の場合には、 digit(B)について
はdigit(B)よびだし部110、root(B。
A)についてはroot(B t A )よびだし部1
11、digit (X )についてはdigit(X
)よびだし部115を生成する。
〔発明の効果〕
この発明によって、複数の解がある論理型言語手続きの
実行の一部をベクトル演算命令を使用しておこなうこと
ができるようになり、その実行が高速になるという効果
がある。
【図面の簡単な説明】
第1図は第6図にしめず論理型言語プログラムを本発明
におけるコンパイラに入力してえられる目的プログラム
を示す図である。第2図は従来技術の説明で使用する論
理型言語プログラムの例を示す図である。第3図は第2
図のプログラムの汎用計算機における実行手順をしめず
フロー図、第4図は第1図の目的プログラムを実行する
ベクトル計算機のブロック図である。第5図は第2図の
プログラムのベクトル計算機における実行手順をしめず
フロー図、第6図はこの発明の実施例における論理型言
語プログラムの例を示す図である。 第7図はベクトル等値性比較命令の動作の説明図、第8
図はベクトル圧縮命令の動作の説明図、第9A〜9G図
は組み合わされて第1図の目的プログラムのベクトル計
算機における実行手順の詳細をしめずフロー図、第10
図は論理型言語プログラムを目的プログラムに変換する
コンパイラの処理のフロー図、第11図は第10図のス
テップ1102の詳細フロー図、第12図は第10図の
牟 /I!1 第2凹 A榎 ?−bird(X)、cann otFly(X)、w
rite(X)、fdi 1.      −−−−2
o6囁3 図 猶4凹 寮5 目 勇6 口 第7n 名8図 鳩9へ口 も9B口 囁9CI!! 名9D凹 猶9E凹 第9F図 fl19Q(!1 毛IO国 晃 1/  I!] 第12図

Claims (1)

  1. 【特許請求の範囲】 1、原始プログラムを目的プログラムに変換するコンパ
    イル方法であって、 (1)よびだしまたはリトライによって起動され、実行
    ごとに実行結果としてことなる引数データを出力する第
    1の処理を起動ごとに実行するようにプログラムされた
    第1の原始プログラム部分と、 (2)(イ)該第1の原始プログラム部分をよびだし、
    (ロ)該よびだしに対して該第1の原始プログラム部分
    から出力された引数データに対して所定の第2種の処理
    を実行し、(ハ)該第1の原始プログラム部分に対して
    リトライを指示し、(ニ)該リトライに対して該第1の
    原始プログラム部分から出力された引数データに対して
    該第2種の処理を実行し、 (ホ)該ステップ(ハ)(ニ)を複数(N−2)回繰り
    返すようにプログラムされた第2の原始プログラム部分
    と から構成される論理型言語の原始プログラムを、(3)
    第1の処理を指定された第1の繰り返し回数まとめて連
    続的に実行して該複数の引数データを要素とする第1の
    配列データを生成するステップ(a)を実行するように
    プログラムされた第1の目的プログラム部分と、 (4)第1のくりかえし回数Nを該第1の目的プログラ
    ム部分に指定して該第1の目的プログラム部分を起動す
    るステップ(b)と、該起動の結果として該第1の目的
    プログラム部分によって出力された第1の配列データの
    各要素に対して該第2の処理を連続的に実行するステッ
    プ(c)とを実行するようにプログラムされた第2の目
    的プログラム部分と から構成される目的プログラムに変換することを特徴と
    する論理型言語プログラムのコンパイル方法。 2、第1項において、第2の原始プログラム部分は、該
    ステップ(イ)又は(ハ)の実行以前に第1のデータを
    計算する所定の第3の処理を実行し、該ステップ(ロ)
    又は(ニ)における該第2の処理において該第1のデー
    タを使用するようにプログラムされており、 (A)該第2の目的プログラム部分は、該ステップ(b
    )の実行以前に該第3の処理を該第2の目的プログラム
    部分で指定された繰り返し回数(N)分まとめて連続的
    に実行し、該第3の処理のくりかえしにより得られた第
    1のデータを要素とする第2の配列データを生成して第
    1の目的プログラムにわたすステップ(d)とをさらに
    実行するように、第1の目的プログラムで生成される後
    述する第3の配列データの各要素について第2の処理を
    実行するように構成し、 (B)第1の目的プログラム部分を、(b)において出
    力される第1の配列データにくわえて、(g)第1の配
    列データの第i要素が(e)におけるj回めのくりかえ
    しでえられる結果であれば、第i要素が第2の配列デー
    タの第j要素とひとしい第3の配列データを生成して第
    2の目的プログラムにかえすように構成する ことを特徴とする論理型言語プログラムのコンパイル方
    法。 3、第1項において、第1の原始プログラムが1個の手
    続きであったM個の節で構成され、第i節は処理Piを
    おこなうようにプログラムされている場合に、第1のプ
    ログラム部分を、 (1)処理Piをおこない第5の配列データを出力する
    第i節対応部(1≦i≦M)と、 (2)第1〜M節対応部から出力されるそれぞれの第5
    の配列データを併合して、それらすべての要素からなる
    第1の配列データを生成する併合部 とで構成することを特徴とする論理型言語プログラムの
    コンパイル方法。 4、第2項において、第1の原始プログラムが1個の手
    続きであってM個の節で構成され、第i節は処理Piを
    おこなうようにプログラムされている場合に、第1のプ
    ログラム部分を、 (1)第2の配列データを複写したM個の第4の配列デ
    ータを生成する複写部と、 (2)第4の配列データのうちの1個を入力して処理P
    iをおこない第5の配列データを出力する第i節対応部
    (1≦i≦M)と、 (3)第1〜M節対応部から出力されるそれぞれの第5
    の配列データを併合して、それらすべての要素からなる
    第3の配列データを生成する併合部 とで構成することを特徴とする論理型言語プログラムの
    コンパイル方法。 5、論理型言語の原始プログラムを目的プログラムに変
    換するコンパイル方法であって、原始プログラムを構成
    する各手続きと質問のそれぞれに対して、 (A)その手続きまたは問題が、よびだしまたはリトラ
    イごとにことなる所定の第1の処理をおこなうかどうか
    を判定し、 (B)前記の判定結果が真であれば、第i節が第2のデ
    ータを入力して処理Piをおこない、その結果として第
    1のデータを出力するようにプログラムされたその手続
    きを構成するM個の節を入力して、 (1)第2のデータを要素とする第2の配列データを複
    写したM個の第4の配列データを 生成する複写部と、 (2)第4の配列データのうちの1個を入力して、その
    各要素について処理Piをおこな い第5の配列データを出力する第i節対応 部(1≦i≦M)と、 (3)第1〜M節対応部から出力されるそれぞれの第5
    の配列データを併合して、それら すべての要素すなわち第1のデータからな る第3の配列データを生成する併合部 とからなる目的プログラムを生成し、 (C)前記の判定結果が偽であれば入力引数データに対
    して第1の処理を実行する第1〜n節対応部を生成する という各処理をおこなうことによって論理型言語の原始
    プログラムを目的プログラムに変換することを特徴とす
    る論理型言語プログラムのコンパイル方法。
JP30641486A 1986-12-24 1986-12-24 論理型言語プログラムのコンパイル方法 Pending JPS63159936A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP30641486A JPS63159936A (ja) 1986-12-24 1986-12-24 論理型言語プログラムのコンパイル方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP30641486A JPS63159936A (ja) 1986-12-24 1986-12-24 論理型言語プログラムのコンパイル方法

Publications (1)

Publication Number Publication Date
JPS63159936A true JPS63159936A (ja) 1988-07-02

Family

ID=17956731

Family Applications (1)

Application Number Title Priority Date Filing Date
JP30641486A Pending JPS63159936A (ja) 1986-12-24 1986-12-24 論理型言語プログラムのコンパイル方法

Country Status (1)

Country Link
JP (1) JPS63159936A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05103384A (ja) * 1991-06-19 1993-04-23 Samsung Electron Co Ltd 遠隔制御方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05103384A (ja) * 1991-06-19 1993-04-23 Samsung Electron Co Ltd 遠隔制御方法

Similar Documents

Publication Publication Date Title
Wise Aspects of applicative programming for parallel processing
US5615309A (en) Inferencing production control computer system
US5615360A (en) Method for interfacing applications with a content addressable memory
JPS5948424B2 (ja) 並列計算システム
Chamberlin The" single-assignment" approach to parallel processing
JPS619760A (ja) ベクトル処理システム
Shapiro Validation of a VLSI chip using hierarchical colored Petri nets
D'Autrechy et al. A general-purpose simulation environment for developing connectionist models
US5109523A (en) Method for determining whether data signals of a first set are related to data signal of a second set
Lah et al. Tree compaction of microprograms
CN116134416A (zh) 避免张量内存布局中存储体冲突和流水线冲突的方法
Rosenberg et al. Mapping massive SIMD parallelism onto vector architectures for simulation
JPS63159936A (ja) 論理型言語プログラムのコンパイル方法
Chetioui et al. P3 problem and Magnolia language: Specializing array computations for emerging architectures
Hyde Introduction to the programming language Occam
Morris et al. The specification of program flow in Madcap 6
Roman et al. Reasoning about synchronic groups
Zehendner A module-based assembly language with parallel processing constructs and its implementation in the ASTOR architecture
Heal et al. Maple 7 Programming Guide
Stotts The PEG environment: parallel programming with Petri net semantics
JPH03135630A (ja) 命令スケジューリング方式
Asokan et al. A neural network simulator for the Connection Machine
Gottlieb PLUS: a PL/I Based Ultracomputer Simulator, I.
GB2202654A (en) Method of compiling a logic programming language program
Benmeziane Accelerating a Deep Learning Framework with Tiramisu