(57)【要約】【課題】本発明は、ネットワーク上でファイル交換を行うときに、誤ったファイル交換が行われないことを実現する新たな分散データ共有技術の提供を目的とする。【解決手段】チャネル生成機能と非決定的選択機能を持つルータを使ってネットワーク上に分散したファイルを交換するための技術を実現すべく、送信側が、ルータチャネルリストのいずれかの要素を通じた秘密通信用チャネルの送信か、終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令をルータに登録することで、受信側に秘密通信用チャネルを渡し、その後に、秘密通信用チャネルを通じたファイルデータの送信命令をルータに登録することで、受信側にファイルデータを転送する。これにより、チャネル生成機能と非決定的選択機能を持つルータを使ってファイルを交換できるようになることで、誤ったファイル交換が行われないことを実現できるようになる。【選択図】図１
2006172255.tif 000002
【特許請求の範囲】
【請求項１】
非決定的選択機能を持つルータを使ってネットワーク上に分散したファイルを交換する分散データ共有方法であって、
データ送信側が、
秘密通信用のチャネルを生成し、さらに、ファイルを検索するためのインデックス情報から生成されるルータのチャネルのリストと終了信号用のチャネルとを生成する過程と、
上記ルータチャネルリストのいずれかの要素を通じた上記秘密通信用チャネルの送信か、上記終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する過程と、
自装置に対応付けられるルータから上記終了信号の受信命令の実行結果を受け取る場合に、処理を終了する過程と、
自装置に対応付けられるルータから上記秘密通信用チャネルの送信命令の実行結果を受け取る場合に、ファイルをオープンしてファイルデータを読み出し、上記秘密通信用チャネルを通じた該ファイルデータの送信命令を該ルータに登録する過程と、
上記ファイルデータの送信命令の実行終了を待ってファイルをクローズして、ファイルデータの送信を再実行するための処理を再起動する過程とを備え、
データ受信側が、
ファイルを検索するためのインデックス情報からルータのチャネルのリストを生成するとともに、終了信号用のチャネルを生成する過程と、
上記ルータチャネルリストのいずれかの要素を通じたデータ送信側により生成される上記秘密通信用チャネルの受信か、上記終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する過程と、
自装置に対応付けられるルータから上記終了信号の受信命令の実行結果を受け取る場合に、処理を終了する過程と、
自装置に対応付けられるルータから上記秘密通信用チャネルの受信命令の実行結果を受け取る場合に、上記秘密通信用チャネルを通じたファイルデータの受信命令を該ルータに登録する過程と、
自装置に対応付けられるルータから上記ファイルデータの受信命令の実行結果を受け取る場合に、該ファイルデータを受け取って処理を終了する過程とを備えることを、
特徴とする分散データ共有方法。
【請求項２】
非決定的選択機能を持つルータを使ってネットワーク上に分散したファイルを交換する分散データ共有方法の実現に用いられる送信側端末装置であって、
秘密通信用のチャネルを生成し、さらに、ファイルを検索するためのインデックス情報から生成されるルータのチャネルと終了信号用のチャネルとを生成する生成手段と、
上記ルータチャネルを通じた上記秘密通信用チャネルの送信か、上記終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する第１の登録手段と、
自装置に対応付けられるルータから上記終了信号の受信命令の実行結果を受け取る場合に、処理を終了する終了手段と、
自装置に対応付けられるルータから上記秘密通信用チャネルの送信命令の実行結果を受け取る場合に、ファイルをオープンしてファイルデータを読み出し、上記秘密通信用チャネルを通じた該ファイルデータの送信命令を該ルータに登録する第２の登録手段と、
上記ファイルデータの送信命令の実行終了を待ってファイルをクローズして、ファイルデータの送信を再実行するための処理を再起動する再起動手段とを備えることを、
特徴とする送信側端末装置。
【請求項３】
請求項２に記載の送信側端末装置において、
上記生成手段は、ネットワーク上で同一ファイルが異なる名前で使用されていることを考慮して、それらの名前に合わせて上記ルータチャネルのリストを生成し、
これに合わせて、上記第１の登録手段は、上記ルータチャネルリストのいずれかの要素を通じた上記秘密通信用チャネルの送信か、上記終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令をルータに登録することを、
特徴とする送信側端末装置。
【請求項４】
非決定的選択機能を持つルータを使ってネットワーク上に分散したファイルを交換する分散データ共有方法の実現に用いられる受信側端末装置であって、
ファイルを検索するためのインデックス情報からルータのチャネルを生成するとともに、終了信号用のチャネルを生成する生成手段と、
上記ルータチャネルを通じたデータ送信側により生成される秘密通信用チャネルの受信か、上記終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する第１の登録手段と、
自装置に対応付けられるルータから上記終了信号の受信命令の実行結果を受け取る場合に、処理を終了する第１の終了手段と、
自装置に対応付けられるルータから上記秘密通信用チャネルの受信命令の実行結果を受け取る場合に、上記秘密通信用チャネルを通じたファイルデータの受信命令を該ルータに登録する第２の登録手段と、
自装置に対応付けられるルータから上記ファイルデータの受信命令の実行結果を受け取る場合に、該ファイルデータを受け取って処理を終了する第２の終了手段とを備えることを、
特徴とする受信側端末装置。
【請求項５】
請求項４に記載の受信側端末装置において、
上記生成手段は、ネットワーク上で同一のファイルが複数のサイトで管理されていることを考慮して、それらのサイトに合わせて上記ルータチャネルのリストを生成し、
これに合わせて、上記第１の登録手段は、上記ルータチャネルリストのいずれかの要素を通じた上記秘密通信用チャネルの受信か、上記終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令をルータに登録することを、
特徴とする受信側端末装置。
【請求項６】
請求項２又は３に記載の送信側端末装置の持つ各処理手段をコンピュータに実現させるための送信側端末装置用プログラム。
【請求項７】
請求項４又は５に記載の受信側端末装置の持つ各処理手段をコンピュータに実現させるための受信側端末装置用プログラム。
【請求項８】
請求項２又は３に記載の送信側端末装置の持つ各処理手段をコンピュータに実現させるための送信側端末装置用プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項９】
請求項４又は５に記載の受信側端末装置の持つ各処理手段をコンピュータに実現させるための受信側端末装置用プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、非決定的選択機能を持つルータを使ってネットワーク上に分散したファイルを交換する分散データ共有方法と、その分散データ共有方法の実現に用いられる送信側端末装置及び受信側端末装置と、その送信側端末装置の実現に用いられる送信側端末装置用プログラム及びそのプログラムを記録したコンピュータ読み取り可能な記録媒体と、その受信側端末装置の実現に用いられる受信側端末装置用プログラム及びそのプログラムを記録したコンピュータ読み取り可能な記録媒体とに関する。
【背景技術】
【０００２】
本発明の背景技術の説明に入る前に、これから使用する用語について説明しておく。
【０００３】
〔１〕タプル空間型ルータ
タプル空間型ルータとは、ネットワーク内に配置される同期型交換機である。タプル空間型ルータは、各ホストからリクエストのリストを受け取り、データの保持・削除を行う。タプル空間型ルータの内部に保持されるデータをタプルと呼ぶ。
【０００４】
リクエストには、
・送信リクエスト（send,adrs,val)  ：  タプル（send,adrs,val)
・受信リクエスト（receive,adrs)   ：  タプル（receive,adrs）
の２つがある。
【０００５】
タプル空間型ルータの動作について説明するならば、タプル空間型ルータは、送信・受信リクエストのリストを各ホストから受け、そのリストに現れる各リクエストに対応するタプルを内部記憶領域（タプル空間と呼ぶ）に逐次格納する。このとき、各タプルには、同じリストに含まれていたリクエストから変換された各タプルが同じ識別子を持つように、識別子が割り当てられる。
【０００６】
そして、タプル空間型ルータは、同じキーａを持つタプル（send,a,b) と（receive,a)とが同時にタプル空間内に存在するかを調べる。もし存在すれば、そのタプル（send,a,b),（receive,a)と、そのタプル（send,a,b) と同じ識別子を持つタプルと、そのタプル（receive,a)と同じ識別子を持つタプルとをすべてタプル空間から取り除く。さらに、送信リクエスト（send,a,b) の送信元ホストに送信完了メッセ−ジを送り、受信リクエスト（receive,a)の送信元ホストに受信メッセ−ジを送る。
【０００７】
〔２〕チャネル
チャネルとは、送信リクエスト（send,adrs,val)や受信リクエスト（receive,adrs) で用いる値adrsのことである。同じチャネルを持つ異なるプロセス間で通信が行われる。
【０００８】
〔３〕同期型通信
同期型通信とは、送信側と受信側とが同期する通信方式である。たとえば、チャネルｃにデータ「１２３」を送信するプロセスＡの動作と、チャネルｃからデータを受信するプロセスＢの動作とが同期することを考える。このとき、プロセスＡのデータ「１２３」の送信が完了したとき、かつ、そのときに限り、プロセスＢはデータ「１２３」の受信を完了している。送信側と受信側とが同期することで、ユーザがａｃｋメッセージなどによる同期をとる必要がない。
【０００９】
〔４〕非決定的選択実行（非決定的選択機能）
非決定的選択実行とは、送信または受信の複数の通信選択肢（後述するアクティブパートに相当するもの）でもって通信リクエスト（後述するパッシブパートに相当するもの）が構成される場合にあって、通信リクエストに属する通信選択肢のうち、ただ一つの通信選択肢のみが成功し、残りの通信選択肢は失敗（通信選択肢が消去される）するような通信の実行をいう。
【００１０】
たとえば、非決定的選択実行では、図３４に示すように、
｛「チャネルｃにデータ「１２３」を送信する（通信選択肢Ａ）」，
「チャネルｄからデータを受信する（通信選択肢Ｂ）」｝
という動作を行うプロセスＸと、
｛「チャネルｃからデータを受信する（通信選択肢Ｃ）」，
「チャネルａからデータを受信する（通信選択肢Ｄ）」｝
という動作を行うプロセスＹとが並行に動作している場合に、通信選択肢（Ａ）と通信選択肢（Ｃ）とが成功して、プロセスＸからプロセスＹにデータ「１２３」が送信され、通信選択肢（Ｂ）と通信選択肢（Ｄ）とは消去されることになる。
【００１１】
次に、本発明の背景技術について説明する。
【００１２】
近年、ピアツーピア型のファイル交換方式が普及しつつある。この方式は、ファイルやデータを集中的に管理するサーバを持つことなく、ホスト間でファイルやドキュメントを交換・共有できる利点を有する。
【００１３】
このような通信方式を実現するための従来技術として、ＳＩＯＮet（例えば、非特許文献１参照）や、Ｇnutella(例えば、非特許文献２参照）や、Ｃhord（例えば、非特許文献３参照）などが知られている。
【００１４】
一方で、タプル空間による通信システムが知られている。これは、タプル空間と呼ばれるルータ（交換機）をネットワーク内に配置し、各計算機プログラムからタプル空間にデータの投入・読み出しを行うことによって、同期型通信（自動的に送信側プログラムと受信側プログラムの同期を取る通信）を実現できる利点を有する。
【００１５】
このタプル空間による同期型通信システムのなかでも、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータを用いた通信システムが知られている（例えば、非特許文献４，５参照）。
【００１６】
このチャネル生成機能と非決定的選択機能を持つタプル空間型ルータを用いた通信システムは、（１）同時に登録された複数の送受信リクエストのうちひとつのみが成功し他が破棄される非決定的選択の機能を持ち、通信に関する排他制御を自動的に行える、（２）各計算機プログラムが過去に使われていないチャネルを生成する機能を持ち、新規生成チャネルを用いた計算機プログラム間の秘密通信を実現できる、という利点を有する。
【００１７】
非特許文献４，５に記載される同期通信システムは、プロセス代数と呼ばれる通信プログラム理論（例えば、非特許文献６参照）を数学的基礎とするため、プロセス代数理論に基づいて計算機プログラムの妥当性検証を行うことによって、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータへのアクセス機能を持つインタプリタによって実行される計算機プログラムの信頼性を高められる利点を有する。また、そのようなプログラム検査を行うための技術として、例えばＭobility Ｗorkbench（例えば、非特許文献７参照）などが知られている。
【非特許文献１】星合隆成，柴田弘，酒井隆道，小柳恵一： "意味情報ネットワークアーキテクチャ：SIONアーキテクチャ", NTTR ＆D, Vol.50, No.3, pp.157-164, 2001
【非特許文献２】http://www.gnutella.com/
【非特許文献３】Ion Stoica, Robert Morris, David Karger, M.Frans Kaashoek, and Hari Balakrishnan, "Chord: A Scalable Peer-to-peer Lookup Service for Internet Applications", ACM SIGCOMM 2001, San Deigo, CA, August 2001, pp.149-160
【非特許文献４】E.Horita and K.Mano, "Nepi: A Network Programming Language Based on the π-calculus", in COORDINATION 96, LNCS Vol.1061, Springer-Verlag, pp.424-427, 1996
【非特許文献５】K.Mano and Y.Kawabe, "Nepi: Syntax, Semantics and Implementation",in SCI 2001 Vol.XIV, pp.326-331
【非特許文献６】R.Milner, "Communicating and Mobile Systems: theπ-Calculus ", Cambridge University Press, 2000
【非特許文献７】Bjorn Victor and Faron Moller, "The Mobility Workbench: A Tool for the  π-Calculus.", in CAV '94, LNCS Vol.818, Springer-Verlag, pp.428-440, 1994
【発明の開示】
【発明が解決しようとする課題】
【００１８】
近年、ピアツーピア型の方式を利用したファイル交換が盛んになっており、インターネット上でファイルやドキュメントが交換・共有されつつあるが、そのようなファイル交換のためのシステムにおいては、プログラムの誤動作等によって深刻な不具合が発生する場合がある。
【００１９】
例えば、個人のプライバシーに関する情報が格納されたファイルや著作権保護されているファイルが、通信システムの誤動作によってネットワーク上に送出されてしまうことなどである。通信システムにおいて、このような誤動作は許されない。
【００２０】
そこで、ピアツーピア型の方式を用いてファイル交換を行う計算機プログラムに対しては、誤動作の可能性がないことをあらかじめ検査してから処理を実行する必要がある。
【００２１】
この問題を解決するひとつの方法として、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータを利用してピアツーピア型のファイル共有を実現することが挙げられる。ファイル共有を行うための計算機プログラムに対してプロセス代数理論に基づくプログラム検査を事前に行うことで、プログラムの誤動作を排除できるからである。これにより、ピアツーピア型通信システム全体の信頼性を高めることが可能となる。
【００２２】
ところが、従来、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータを利用して、どのようにピアツーピア型のファイル共有を実現すればよいかは知られていなかった。
【００２３】
本発明はかかる事情に鑑みてなされたものであって、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータを使ってネットワーク上に分散したファイルを交換するための実現技術を提供することにより、ピアツーピア型の方式を用いてファイル交換を行うときに、誤ったファイル交換が行われないことを実現する新たな分散データ共有技術の提供を目的とする。
【課題を解決するための手段】
【００２４】
本発明の分散データ共有方法は、プログラムを実行する複数の端末装置と、それらの端末装置に対応付けて設けられるチャネル生成機能と非決定的選択機能を持つタプル空間型ルータとがネットワークを介して接続されるシステムに適用される。
【００２５】
そして、本発明の端末装置は、本発明の分散データ共有方法の実現に用いられるものであり、自装置に対応付けて備えられるタプル空間型ルータの持つチャネル生成機能を使ってチャネルを生成する処理を行う。
【００２６】
〔１〕ファイル送信側となる本発明の端末装置の構成
ファイル送信側となる本発明の端末装置は、（１）秘密通信用のチャネルを生成し、さらに、ファイルを検索するためのインデックス情報から生成されるルータのチャネルと終了信号用のチャネルとを生成する生成手段と、（２）ルータチャネルを通じた秘密通信用チャネルの送信か、終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する第１の登録手段と、（３）自装置に対応付けられるルータから終了信号の受信命令の実行結果を受け取る場合に、処理を終了する終了手段と、（４）自装置に対応付けられるルータから秘密通信用チャネルの送信命令の実行結果を受け取る場合に、ファイルをオープンしてファイルデータを読み出し、秘密通信用チャネルを通じたそのファイルデータの送信命令を自装置に対応付けられるルータに登録する第２の登録手段と、（５）ファイルデータの送信命令の実行終了を待ってファイルをクローズして、ファイルデータの送信を再実行するための処理を再起動する再起動手段とを備えるように構成する。
【００２７】
この構成を採るときにあって、生成手段は、ネットワーク上で同一ファイルが異なる名前で使用されていることを考慮して、それらの名前に合わせてルータチャネルのリストを生成することがあり、このときには、第１の登録手段は、ルータチャネルリストのいずれかの要素を通じた秘密通信用チャネルの送信か、終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令をルータに登録することになる。
【００２８】
以上の各処理手段はコンピュータプログラムでも実現できるものであり、このコンピュータプログラムは、適当なコンピュータ読み取り可能な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００２９】
〔２〕ファイル受信側となる本発明の端末装置の構成
ファイル受信側となる本発明の端末装置は、（１）ファイルを検索するためのインデックス情報からルータのチャネルを生成するとともに、終了信号用のチャネルを生成する生成手段と、（２）ルータチャネルを通じたデータ送信側により生成される秘密通信用チャネルの受信か、終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する第１の登録手段と、（３）自装置に対応付けられるルータから終了信号の受信命令の実行結果を受け取る場合に、処理を終了する第１の終了手段と、（４）自装置に対応付けられるルータから秘密通信用チャネルの受信命令の実行結果を受け取る場合に、秘密通信用チャネルを通じたファイルデータの受信命令をそのルータに登録する第２の登録手段と、（５）自装置に対応付けられるルータからファイルデータの受信命令の実行結果を受け取る場合に、そのファイルデータを受け取って処理を終了する第２の終了手段とを備えるように構成する。
【００３０】
この構成を採るときにあって、生成手段は、ネットワーク上で同一のファイルが複数のサイトで管理されていることを考慮して、それらのサイトに合わせてルータチャネルのリストを生成することがあり、このときには、第１の登録手段は、ルータチャネルリストのいずれかの要素を通じた秘密通信用チャネルの受信か、終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令をルータに登録することになる。
【００３１】
以上の各処理手段はコンピュータプログラムでも実現できるものであり、このコンピュータプログラムは、適当なコンピュータ読み取り可能な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００３２】
〔３〕本発明の分散データ共有方法の処理
図１に、以下に説明する本発明の分散データ共有方法についての処理の流れを図式化して示す。
【００３３】
このように構成される本発明では、ファイル送信側となる端末装置は、秘密通信用のチャネルを生成し、さらに、ネットワーク上に分散したファイルを検索するためのインデックス情報から、それらのインデックス情報に対応するルータのチャネルのリストを生成するとともに、終了信号用のチャネルを生成する。
【００３４】
続いて、その生成したチャネルリストのいずれかの要素を通じた秘密通信用チャネルの送信か、その生成した終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する。
【００３５】
一方、ファイル受信側となる端末装置は、ネットワーク上に分散したファイルを検索するためのインデックス情報から、それらのインデックス情報に対応するルータのチャネルのリストを生成するとともに、終了信号用のチャネルを生成する。
【００３６】
続いて、その生成したチャネルリストのいずれかの要素を通じた秘密通信用チャネルの受信か、その生成した終了信号用チャネルを通じた終了信号の受信のどちらかを行う命令を自装置に対応付けられるルータに登録する。
【００３７】
これらの命令の登録を受けて、送信命令の登録されたルータはルータチャネルの一致する受信命令の登録されたルータを探し出し、あるいは、受信命令の登録されたルータはルータチャネルの一致する送信命令のルータを探し出すことで、ファイル送信側となる端末装置とファイル受信側となる端末装置との組み合わせが決定されることになる。
【００３８】
この組み合わせが決定されると、ファイル送信側となる端末装置に対応付けられるルータからファイル受信側となる端末装置に対応付けられるルータへと秘密通信用チャネルが送信されることになるとともに、ルータの持つ非決定的選択機能により、それぞれのルータに登録された命令は消去されることになる。
【００３９】
このようにして登録した命令がルータから消去されると、ファイル送信側となる端末装置は、送信対象のファイルをオープンしてファイルデータを読み出し、秘密通信用チャネルを通じたそのファイルデータの送信命令を自装置に対応付けられるルータに登録し、一方、ファイル受信側となる端末装置は、秘密通信用チャネルを通じたそのファイルデータの受信命令を自装置に対応付けられるルータに登録する。
【００４０】
これらの命令の登録を受けて、送信命令の登録されたルータは秘密通信用チャネルの一致する受信命令の登録されたルータを探し出し、あるいは、受信命令の登録されたルータは秘密通信用チャネルの一致する送信命令のルータを探し出すことで、先に決定されたファイル送信側となる端末装置とファイル受信側となる端末装置との組み合わせが再度特定されることになる。
【００４１】
この組み合わせの再特定を受けて、ファイル送信側となる端末装置に対応付けられるルータからファイル受信側となる端末装置に対応付けられるルータへとファイルデータが送信されることになるとともに、ルータの持つ非決定的選択機能により、それぞれのルータに登録された命令は消去されることになる。
【００４２】
このようにしてファイルデータの実行が終了すると、ファイル送信側となる端末装置は、ファイルをクローズしてから、別の端末装置へファイルデータを送信すべく、（ｉ）ルータチャネルリスト／終了信号用チャネルを新たに生成して処理を繰り返したり、（ii）それらのチャネルに加えて秘密通信用チャネルについても新たに生成して処理を繰り返したり、（iii)チャネルについては新たに生成しないで、前回生成した命令（秘密通信用チャネルの送信か終了信号の受信のどちらかを行う命令）をルータに登録する処理を繰り返すことで、別の端末装置へファイルデータを送信すべく処理を繰り返していき、一方、ファイル受信側となる端末装置は、自装置に対応付けられるルータからファイルデータを受け取って処理を終了していくことになる。
【００４３】
このように動作するときにあって、ファイル送信側となる端末装置は、例えば規定の時間が経過することでファイルデータの送信を終了するときには、終了信号用チャネルを通じた終了信号の送信命令を自装置に対応付けられるルータに登録し、これを受けて、ルータは、先に登録されている終了信号用チャネルを通じた終了信号の受信命令を終了し（その受信命令を含む命令を消去する）、これを受けて、ファイル送信側となる端末装置は、処理を終了する。
【００４４】
また、このように動作するときにあって、ファイル受信側となる端末装置は、例えば規定の時間が経過することでファイルデータの受信待ちを終了するときには、終了信号用チャネルを通じた終了信号の送信命令を自装置に対応付けられるルータに登録し、これを受けて、ルータは、先に登録されている終了信号用チャネルを通じた終了信号の受信命令を終了し（その受信命令を含む命令を消去する）、これを受けて、ファイル受信側となる端末装置は、処理を終了する。
【発明の効果】
【００４５】
以上説明したように、本発明によれば、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータを使ってネットワーク上に分散したファイルを交換することができるようになる。
【００４６】
これにより、本発明によれば、ピアツーピア型の方式を用いてファイル交換を行うときに、誤ったファイル交換が行われないことを実現できるようになる。
【００４７】
そして、本発明によれば、非決定的選択機能を持つタプル空間型ルータを使ってネットワーク上に分散したファイルを交換するので、ネットワーク上で同一ファイルが異なる名前で使用されている場合や、ネットワーク上で同一のファイルが複数のサイトで管理されている場合に、特別な工夫を凝らすことなくそのまま対応できるようになる。
【発明を実施するための最良の形態】
【００４８】
以下、実施の形態に従って本発明を詳細に説明する。
【００４９】
ピアツーピア型通信システムは、ネットワークとそれに接続される複数のホストとから構成されるものである。
【００５０】
ピアツーピア型通信システムを構成する各ホストは、図２に示すように、メモリ上にプログラム実行部をひとつ又は複数個持ち、さらに、本発明を実現する場合、各プログラム実行部には、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータがひとつ接続されている。
【００５１】
各ホストはＩＰアドレスをひとつ持つ。また、各タプル空間型ルータはホスト内で固有のポート番号をひとつ持つ。このＩＰアドレスとポート番号とを組にして整数表現することは容易に可能である。例えば、３２ビット表現のＩＰアドレスと１６ビット表現のポート番号とを連接することで４８ビットのビット列を構成し、それを整数表現とみなせばよい。このような整数表現をタプル空間型ルータのアドレス（あるいは単にアドレス）と呼ぶ。プログラム実行部のアドレスは、唯一接続されているタプル空間型ルータのアドレスである。
【００５２】
このタプル空間型ルータを使った通信システムについては、本発明者が特開2003-140911 で開示しているが、そこでは、プログラム実行部をクライアントとして記載し、タプル空間型ルータを通信サーバとして記載している。
【００５３】
このように、本発明の適用される通信システムは、図３に示すように、どこかのサイトで動作して通信リクエストを発行するプログラム実行部１-i（ｉ＝１〜Ｎ）と、プログラム実行部１-iに対応付けて設けられるチャネル生成機能と非決定的選択機能を持つタプル空間型ルータ２-i（ｉ＝１〜Ｎ）と、それらのタプル空間型ルータ２-iを接続するネットワーク３とで構成されるものである。
【００５４】
本発明の説明に入る前に、本発明者が特開2003-140911 で開示したタプル空間型ルータ２-iを使った通信システムの概要について説明する。
【００５５】
〔１〕タプル空間型ルータ２-iを使った通信システムの概要
タプル空間型ルータ２-iは、図４に示すように、プログラム実行部１-iとの間のデータの受け渡しのために設けられる共有メモリ２０と、ネットワーク３との間のデータの受け渡しを制御するネットワークコントローラ２１と、アクティブパートを処理するアクティブパート処理部２２と、パッシブパートを処理するパッシブパート処理部２３とを備える。ここで、各処理部はメモリ上に展開されてＣＰＵにより実行されることになるが、共有メモリ２０についてはパッシブパート処理部２３の内部に配置されることになる。
【００５６】
〔１−１〕アクティブパートについて
アクティブパート（図３４において通信選択肢として記載した通信リクエスト）は、
＜ｃＦＲ，ｐＦＲ，ｐＩＤ，ａＩＤ，ｂｏｄｙ＞
という５項組のレコードで構成される。
【００５７】
これらの各フィールドの意味は、
・ｃＦＲ  ：  アクティブパート処理部２２の識別子
識別子：「ＩＰアドレス＋ポート番号」などが用いられる
・ｐＦＲ  ：  パッシブパート処理部２３の識別子                                                  識別子：「ＩＰアドレス＋ポート番号」などが用いられる
・ｐＩＤ  ：  パッシブパートの識別子
・ａＩＤ  ：  アクティブパートの識別子
・ｂｏｄｙ：  通信リクエスト本体
通信リクエストは、以下のどちらかのフォーマットに従う
＜！，＜ｃＦＲ，ｃｈ＞，ｄａｔａ＞
＜？，＜ｃＦＲ，ｃｈ＞，ｎｕｌｌ＞
である。
【００５８】
ただし、chは整数または文字列とする。！または？をリクエストの極性と呼ぶ。！は送信リクエストを表し、？は受信リクエストを表す。また、＜cFR , ch＞部はチャネル、data部は送信されるデータである。また、アクティブパートａに関して、第１要素cFR 、第２要素pFR 、第３要素pID 、第４要素aID 及び第５要素bodyを、Ｃ言語の構造体と同様の表記を用いて、それぞれa.cFR 、a.pFR 、a.pID 、a.aID 及びa.bodyと表記する。さらに、通信リクエストbodyに関して、第１要素（！または？部）、第２要素（＜cFR ，ch＞部）及び第３要素（dataまたは「null」部）を、Ｃ言語の構造体と同様の表記を用いて、それぞれbody.polar、body.chan 及びbody.valueと表記する。
【００５９】
例えば、
・ａ１＝ < 2,1,1,1, < !, < 2,1 >, 123 >>
・ａ２＝ < 4,5,2,3, < ?, < 4,2 >, null >> 
・ａ３＝ < 4,5,2,5, < ?, < 4,"abc" >, null >> 
というアクティブパートａ１，ａ２，ａ３は、それぞれ、
・ａ１  ：  チャネル < 2,1 >へのデータ「１２３」の送信を試みるリクエスト
・ａ２  ：  チャネル < 4,2 >からデータの受信を試みるリクエスト
・ａ３  ：  チャネル < 4,"abc" >からデータの受信を試みるリクエスト
を表している。
【００６０】
〔１−２〕パッシブパートについて
パッシブパート（図３４において通信選択肢の集合として記載した通信リクエスト）は、
＜ＬＫ１，ＬＫ２，ａｃｔｓ＞
ＬＫ１  ：アクティブパートの集合
ＬＫ２  ：空（null）またはアクティブパートの二項組
ａｃｔｓ：アクティブパートの集合
という３項組のレコードで構成される。
【００６１】
アクティブパートの場合と同様に、Ｃ言語の構造体と同様の表記を用い、パッシブパートｐのＬＫ１部、ＬＫ２部について、それぞれp.LK1 、p.LK2 と表記する。
【００６２】
このＬＫ１には、後述する"lock1" メッセージに従って、データの受け渡し要求が合致したアクティブパートの組の受信側のアクティブパートが書き込まれることになる。ここで、別々のアクティブパート処理部２２から "lock1"メッセージが通知されてくる場合もあるので、複数のアクティブパートが書き込まれることがある。ただし、パッシブパート処理部２３は、それまで空であった場合にだけ、後述する"lock2" メッセージを送信することになる。
【００６３】
一方、ＬＫ２には、ＬＫ１にアクティブパートが書き込まれていることで同期処理のロックが進行中である場合に、その同期処理を待機する別の同期処理についての情報（具体的には、データの受け渡し要求が合致したアクティブパートの組の情報）が書き込まれることになる。
【００６４】
例えば、
・ｐ１＝ <｛｝,null,｛ < 2,1,1,1, < !, < 2,1 >, 123 >> ,
< 4,1,1,2, < ?, < 4,"abc" >, null>> ｝> 
というパッシブパートｐ１は、
・チャネル < 2,1 >にデータ「１２３」を送る動作
・チャネル < 4,"abc" >  からデータを受ける動作
という２つの動作を表す通信リクエストを含む通信リクエストの集合を示している。このパッシブパートｐ１は、２つの通信リクエストのいづれかひとつの動作のみが成功し、残りの動作はキャンセルされるという意味のリクエスト集合として用いられる。
【００６５】
〔１−３〕アクティブパート処理部２２について
アクティブパート処理部２２は、アクティブパートを処理するものであり、図５に示すように、ＡＣＴと呼ばれる記憶領域と、ＬＫ１と呼ばれる記憶領域とを持ち、ネットワークコントローラ２１から、
<"try", a >   ：  アクティブパートａとデータの受け渡し要求が合致するアク
ティブパートがＡＣＴにあるかを調べよというメッセージ
<"fail", a >  ：  ＬＫ１からアクティブパートａを削除して、それをＡＣＴに
戻せというメッセージ
<"fin", a >   ：  ＬＫ１、ＡＣＴからアクティブパートａを削除しろというメ
ッセージ
というメッセージを受け取る。
【００６６】
さらに、データの受け渡し要求に合致するアクティブパートの組を見つけた場合には、ネットワークコントローラ２１に対して、
<"lock1", r, s >  ：  このアクティブパートの組がデータの受け渡し要求に合致
したということを通知するメッセージ（通知先は受信側の
アクティブパートｒを持つパッシブパートを処理するパッ
シブパート処理部２３
というメッセージ（受信側のアクティブパートｒを持つパッシブパートのロックを指示するメッセージ）を送る。
【００６７】
ＡＣＴには、ネットワークコントローラ２１から受け取ったアクティブパートが格納されることになる。また、ＬＫ１には、データの受け渡し要求が合致したアクティブパートが格納されることになる。ここで、ＬＫ１に格納されたアクティブパートについては、ＡＣＴから削除されることになる。
【００６８】
アクティブパート処理部２２は、ネットワークコントローラ２１から受け取ったアクティブパートをＡＣＴに格納するとともに、ネットワークコントローラ２１から受け取ったアクティブパートとデータの受け渡し要求が合致するアクティブパートがＡＣＴにあるのかを調べて、データの受け渡し要求が合致するアクティブパートの組が見つかると、受信側のアクティブパートを持つパッシブパートをロックすべく、受信側のアクティブパートｒを持つパッシブパートを処理するパッシブパート処理部２３に対して"lock1" メッセージを送出する。
【００６９】
〔１−４〕パッシブパート処理部２３について
パッシブパート処理部２３は、パッシブパートを処理するものであり、図６に示すように、ＰＡＳと呼ばれる記憶領域と、fromClientと呼ばれる記憶領域と、ＤＯＮＥと呼ばれる記憶領域とを持ち、ネットワークコントローラ２１から、
<"lock1", r, s >  ：  上述したメッセージ。受信側のアクティブパートｒを持つ
パッシブパートをロックしろというメッセージ
<"lock2", r, s >  ：  送信側のアクティブパートｓを持つパッシブパートをロッ
クしろというメッセージ
<"val", r, date > ：  アクティブパートｒのデータを受信しろというメッセージ
<"cancel", r, null >：アクティブパートｒのロックを解除しろというメッセージ
というメッセージを受け取る。
【００７０】
さらに、"lock1" メッセージに応答してパッシブパートをロックできた場合には、ネットワークコントローラ２１に対して、
<"lock2", r, s >  ：  送信側のアクティブパートｓを持つパッシブパートをロッ
クしろというメッセージ（通知先は送信側のアクティブパ
ートｓを持つパッシブパートを処理するパッシブパート処
理部２３）
というメッセージを送信する。
【００７１】
ＰＡＳには、プログラム実行部１-iから受け取ったパッシブパートの集合が格納されることになる。fromClientには、プログラム実行部１-iから受け取ったパッシブパートが一時的に格納されることになる。ＤＯＮＥには、プログラム実行部１-iへの返答メッセージの集合が格納されることになる。ここで、プログラム実行部１-iへ返答したパッシブパートについては、ＰＡＳから削除されることになる。
【００７２】
パッシブパート処理部２３は、fromClientからパッシブパートを読み出し、そのパッシブパートで指定されるアクティブパートの集合を得ると、ネットワークコントローラ２１を介して、それらのアクティブパートについての処理を指示する上述した"try" メッセージをアクティブパート処理部２２に送る。
【００７３】
この"try" メッセージを受け取ると、アクティブパート処理部２２は、上述した"lock1" メッセージを送信してくる。
【００７４】
パッシブパート処理部２３は、この"lock1" メッセージを受け取ると、別の"lock1" メッセージによってパッシブパートがロックされていないかを調べて（上述したパッシブパートのＬＫ１領域を参照することで調べる）、ロックできた場合には、"lock2" メッセージを送信する。
【００７５】
一方、パッシブパート処理部２３は、"lock2" メッセージを受け取ると、その"lock2" メッセージで指定されるパッシブパートが別の"lock1" メッセージによってロックされていないかを調べて（上述したパッシブパートのＬＫ１領域を参照することで調べる）、ロックできた場合には、同期処理が完了したことを判断して、受信側のパッシブパートを処理するパッシブパート処理部２３に対して"val" メッセージを送信する。
【００７６】
この処理にあって、パッシブパート処理部２３は、"lock2" メッセージを受け取るときにあって、別の"lock1" メッセージによってパッシブパートがロックされている場合に、そのまま同期処理を諦めるのではなくて、他の同期処理が待機していない場合には（上述したパッシブパートのＬＫ２領域を参照することで調べる）、ある判断基準を用いて、"lock2" メッセージで通知されるデータの受け渡し要求が合致するアクティブパートの組を待機させるのか否かを判断して、その判断基準を充足する場合には、そのアクティブパートの組の同期処理を待機させる。そして、そのロックが解除される場合には、その待機させた同期処理を格上げして同期処理を行う。
【００７７】
〔１−５〕返答メッセージについて
ＤＯＮＥに格納される返答メッセージは、
＜ａｃｔ，ａｃｔｓ，ｎｕｌｌ又はｄａｔａ＞
という３項組のレコードで構成される。
【００７８】
これらの各フィールドの意味は、
・ａｃｔ        ：  通信に成功したアクティブパート
・ａｃｔｓ      ：  ａｃｔを含むアクティブパートの集合
・null又はdata  ：  通信に成功したアクティブパートが送信リクエスト
ならばnull、受信リクエストならば受信データ
を表している。
【００７９】
また、返答メッセージret に関して、第１要素、第２要素及び第３要素を、Ｃ言語の構造体と同様の表記を用いて、それぞれret.retact、ret.retacts 及びret.retvalueと表記する。
【００８０】
〔１−６〕処理の一例
このように構成されるタプル空間型ルータ２-iは、チャネルの一致するアクティブパートを持つ送信側と受信側との間でデータの送受信を行うように制御する。
【００８１】
図７は、アクティブパート処理部２２において、受信側のアクティブパートａ２と送信側のアクティブパートｂ３とのデータの受け渡し要求が合致して、最終的に同期処理が成功した場合の処理例である。
【００８２】
この場合、ａ２とｂ３とを指定する"lock1" メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部２３に送られる。このとき、パッシブパートＡのＬＫ１領域が空であることで、ＬＫ１領域にａ２が書き込まれ、これにより仮押えのロックがとれる。
【００８３】
続いて、ａ２とｂ３とを指定する"lock2" メッセージが、ｂ３を持つパッシブパートＢを処理するパッシブパート処理部２３に送られる。このとき、パッシブパートＢのＬＫ１領域が空であることが検出されると、本押えのロックに成功して、ａ２にデータを転送するという"val" メッセージが送られて、そのデータがプログラム実行部１-iに渡されることになる。
【００８４】
図８は、アクティブパート処理部２２において、受信側のアクティブパートａ２と送信側のアクティブパートｂ３とのデータの受け渡し要求が合致したものの、最終的に同期処理が失敗した場合の処理例である。
【００８５】
この場合、ａ２とｂ３とを指定する"lock1" メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部２３に送られる。このとき、パッシブパートＡのＬＫ１領域が空であることで、ＬＫ１領域にａ２が書き込まれ、これにより仮押えのロックがとれる。
【００８６】
続いて、ａ２とｂ３とを指定する"lock2" メッセージが、ｂ３を持つパッシブパートＢを処理するパッシブパート処理部２３に送られる。このとき、パッシブパートＢのＬＫ１領域に、別の同期処理の仮押えが成立していることを示すアクティブパートｂ１が書き込まれていることを検出する。
【００８７】
そこで、ａ２とｂ１とをある基準で比較して、ａ２のロックを待機させるのか否かを判断する。この例では、ａ２が待機する同期処理として選ばれないことを想定しており、パッシブパートＢのＬＫ２領域には何も書き込まれない。
【００８８】
本押えのロックに失敗し、さらに、待機状態にも入らないことが決まったので、ａ２の仮押えを解除すべく、ａ２を指定する"cancel"メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部２３に送られる。
【００８９】
図９は、アクティブパート処理部２２において、受信側のアクティブパートａ２と送信側のアクティブパートｂ３とのデータの受け渡し要求が合致したものの、本押えのロックに失敗して待機に入った場合の処理例である。
【００９０】
この場合、ａ２とｂ３とを指定する"lock1" メッセージが、ａ２を持つパッシブパートＡを処理するパッシブパート処理部２３に送られる。このとき、パッシブパートＡのＬＫ１領域が空であることで、ＬＫ１領域にａ２が書き込まれ、これにより仮押えのロックがとれる。
【００９１】
続いて、ａ２とｂ３とを指定する"lock2" メッセージが、ｂ３を持つパッシブパートＢを処理するパッシブパート処理部２３に送られる。このとき、パッシブパートＢのＬＫ１領域に、別の同期処理の仮押えが成立していることを示すアクティブパートｂ１が書き込まれていることを検出する。
【００９２】
そこで、ａ２とｂ１とをある基準で比較して、ａ２のロックを待機させるのか否かを判断する。この例では、ａ２が待機する同期処理として選ばれたことを想定しており、これにより、ａ２とｂ３との組の同期処理が待機に入ったことを示すべく、パッシブパートＢのＬＫ２領域に、ａ２とｂ３との組の情報が書き込まれる。
【００９３】
待機状態に入ったので、ａ２の仮押えは解除されず、パッシブパートＢのＬＫ１領域に書き込まれているｂ１の本押えが成功するのか失敗するのか待つことになる。
【００９４】
図１０は、図９で待機状態に入った後に、待機状態に入る原因となったｂ１の本押えが成功した場合の処理例である。
【００９５】
この場合には、ｂ１を持つパッシブパートＢを処理するパッシブパート処理部２３に対して、送信側から、ｂ１のデータを転送するという"val" メッセージが送られてくるので、このパッシブパート処理部２３は、それを受け取ってデータをプログラム実行部１-iに渡す。さらに、待機状態は意味がなくなったので、待機状態にあったａ２の仮押えを解除すべく、ａ２を指定する"cancel"メッセージを、ａ２を持つパッシブパートＡを処理するパッシブパート処理部２３に送る。
【００９６】
図１１は、図９で待機状態に入った後に、待機状態に入る原因となったｂ１の本押えが失敗した場合の処理例である。
【００９７】
この場合には、ｂ１を持つパッシブパートＢを処理するパッシブパート処理部２３に対して、送信側から、ｂ１の仮押えをキャンセルする"cancel"メッセージが送られてくるので、このパッシブパート処理部２３は、パッシブパートＢのＬＫ１領域に書き込まれているｂ１を消去する。さらに、待機状態を格上げして、ａ２とｂ３との組の同期処理が成功したことに対応させて、ａ２を持つパッシブパートを処理するパッシブパート処理部２３に対して、ａ２のデータを転送するという"val" メッセージを送る。
【００９８】
以上に説明したことから分かるように、タプル空間型ルータ２-iを使った通信システムでは、同時に登録された複数の送受信リクエストのうちひとつのみが成功し他が破棄されるという非決定的選択機能に従って、送信側と受信側との間でデータを送受信するように処理することになる。
【００９９】
〔２〕タプル空間型ルータ２-iのチャネル生成機能について
本発明で用いるタプル空間型ルータ２-iは、上述したように、チャネルの一致するアクティブパートを持つ送信側と受信側との間でデータの送受信を行うように制御するものであり、上述したような非決定的選択機能の他にチャネル生成機能を有していて、プログラム実行部１-iは、このチャネル生成機能を呼び出して、タプル空間型ルータ２-iのチャネルや秘密通信用のチャネルを生成するように処理することになる。
【０１００】
ここで、チャネルはレコード＜adrs, ch＞で定義される。ただし、adrsは整数、chは整数または文字列である。また、ファイルを検索するためのインデックス情報は、＜nameofFile，hostname，port＞の形式のレコ−ドである。ただし、nameofFile及びhostnameは文字列、portは整数である。
【０１０１】
〔２−１〕チャネル生成処理の概要
次に、このチャネルの生成処理について説明する。
【０１０２】
図１２に、このチャネルの生成処理の処理フローを図示する。
【０１０３】
この処理フローに示すように、タプル空間型ルータ２-iの持つチャネル生成機能は、プログラム実行部１-iからチャネルの生成要求があると、先ず最初に、ステップ１０で、チャネルの生成を要求したプログラム実行部１-iのＩＰアドレスと、自タプル空間型ルータ２-iのポート番号と、送信するファイルのファイル名とを取得する。
【０１０４】
続いて、ステップ１１で、取得したＩＰアドレスの整数表現を算出し、続くステップ１２で、その算出したＩＰアドレスの整数表現を左に１６ビットシフトする。続いて、ステップ１３で、そのシフトしたＩＰアドレスの整数表現と取得したポート番号との和を算出し、続くステップ１４で、その算出した和の値と取得したファイル名との数字文字列に従ってチャネルを生成して、それをプログラム実行部１-iに返して、処理を終了する。
【０１０５】
〔２−２〕チャネル生成処理の詳細
次に、このチャネル生成処理を実行する、インデックス情報からチャネルを生成する関数ch(nameofFile,hostname,port)の詳細な手順について説明する。
【０１０６】
図１３に、このチャネル生成手順の流れを図示する。ここで、文字列str をホスト名とみなし、そのホスト名に対応するＩＰアドレスの整数表現を返すライブラリ関数resolv(str) が、ＯＳによって提供されているとする。
【０１０７】
『チャネル生成手順１』
ローカル変数CHname、CHadrs、CHtmp1及びCHtmp2のためのメモリ領域を確保する。
【０１０８】
『チャネル生成手順２』
変数CHnameに引数nameofFileの値を格納し、変数CHadrsに値０を格納し、変数CHtmp1に引数hostnameの値を格納し、変数CHtmp2に引数portの値を格納する。
【０１０９】
『チャネル生成手順３』
resolv(CHtmp1)を評価し、評価結果を変数CHadrsに格納する。次に、変数CHadrsの値を左に１６ビットシフトし、評価結果を変数CHadrsに格納する。
【０１１０】
『チャネル生成手順４』
変数CHadrsの値と変数CHtmp2の値との和を計算し、評価結果を変数CHadrsに格納する。
【０１１１】
『チャネル生成手順５』
＜CHadrs, CHname＞の評価結果を、変数CHtmp1に格納する。
【０１１２】
『チャネル生成手順６』
変数CHtmp1の値を返して終了する。
【０１１３】
〔２−３〕チャネル生成処理の具体例
次に、インデックス情報＜"hosts","senderA.domainA",5050＞からのチャネルの生成である、関数ch（"hosts","senderA.domainA",5050）の動作について具体的に説明する。
【０１１４】
ただし、"senderA.domainA" のＩＰアドレスは、100.110.120.130 とする。なお、このＩＰアドレスの整数表現は、
130 ＋120 ×256 ＋110 ×256 ×256 ＋100 ×256 ×256 ×256 ＝1684961410
である。
【０１１５】
『チャネル生成処理１』
ローカル変数CHname、CHadrs、CHtmp1及びCHtmp2のためのメモリ領域を確保する。
【０１１６】
『チャネル生成処理２』
変数CHnameに"hosts" を格納し、変数CHadrsに値０を格納し、変数CHtmp1に"senderA.domainA" を格納し、変数CHtmp2に5050を格納する。
【０１１７】
『チャネル生成処理３』
resolv（CHtmp1）を評価し、評価結果1684961410を変数CHadrsに格納する。次に、変数CHadrsの値を左に１６ビットシフトし、評価結果110425630965760 を変数CHadrsに格納する。
【０１１８】
『チャネル生成処理４』
変数CHadrsの値110425630965760 と変数CHtmp2の値5050との和を計算し、評価結果110425630970810 を変数CHadrsに格納する。
【０１１９】
『チャネル生成処理５』
＜CHadrs, CHname＞の評価結果である<110425630970810,"hosts"> を、変数CHtmp1に格納する。
【０１２０】
『チャネル生成処理６』
変数CHtmp1の値<110425630970810,"hosts"> を返して終了する。
【０１２１】
このようにして、プログラム実行部１-iは、タプル空間型ルータ２-iのチャネル生成機能を呼び出してチャネルを生成するように処理するのである。
【０１２２】
〔３〕本発明について
本発明では、プログラム実行部１-iは、このようなチャネル生成機能と非決定的選択機能を持つタプル空間型ルータ２-iを使って、ネットワーク３上に分散したファイルを交換するように処理することになる。
【０１２３】
図１４に、本発明を実現するためのプログラム実行部１-iの構成の一例を図示する。
【０１２４】
この図に示すように、プログラム実行部１-iは、内部に、複数のデータ送信実行部１０と、複数のデータ受信実行部１１と、データ送信実行部１０やデータ受信実行部１１を起動するためのトップレベル実行部１２とを持つ。
【０１２５】
プログラム実行部１-iとプログラム実行部１-i内の各処理部は、Ｌisp 言語と同様のリスト（例えば、（a b c d ）など）を処理する。ただし、Ｌisp 言語での空リストnil を表す記号として値nullを用いる。また、プログラム実行部１-iとプログラム実行部１-i内の各処理部は、図１５の評価関数によってリスト処理を行い、また、図１６の評価関数によってファイルアクセス処理を行う。
【０１２６】
プログラム実行部１-iは、変数recvDat 、CLIENTadrs及びCLIENTpasid を持つ。また、プログラム実行部１-iは、プログラム格納用の変数progを持つ。これらの変数は、プログラム実行部１-iの持つ各処理部によって共有され、プログラム実行部１-iの持つ各処理部は共有メモリに対する値の読み出し及び書き込みが可能である。
【０１２７】
プログラム格納用変数progには、あらかじめユーザがプログラムコードをファイルなどから読み込んで代入する。このプログラムコードは、トップレベル実行部１２によって解釈実行される。
【０１２８】
〔３−１〕プログラム実行部１-iの処理
プログラム実行部１-iは、
（ｉ）値nullを変数recvDat に格納し、プログラム実行部１-iの動作するＩＰアドレス（ＯＳから取得可能）とポート番号（ＯＳから取得可能）とから生成されるアドレスを変数CLIENTadrsに格納し、値０を変数CLIENTpasid に格納してから、
（ii）トップレベル実行部１２を起動する、
という処理を実行する。
【０１２９】
このようにして、プログラム実行部１-iは、値nullを変数recvDat に格納し、自アドレスを変数CLIENTadrsに格納し、値０を変数CLIENTpasid に格納してから、トップレベル実行部１２を起動するのである。
【０１３０】
〔３−２〕トップレベル実行部１２の処理
トップレベル実行部１２は、Ｌisp インタプリタのトップレベルと同様の機能（ＵＮＩＸ（登録商標）やＭＳ−ＤＯＳで言うと、シェルに相当する）を有するものであり、プログラム格納用変数progに格納されたプログラムコードを解釈実行する機能を持つ。
【０１３１】
このトップレペル実行部１２は、
（イ）代入文、if、goto、サブルーチン呼出しなど、プログラム言語としての基本的な        命令
（ロ）チャネル生成機能と非決定的選択機能を持つタプル空間型ルータ２-iの新規チャ        ネル生成機能を呼び出して、通信システム全体で使われていない新規チャネル（        秘密通信チャネルとして使用する）を取得するための図１７に示す命令pexecNew        Chan
（ハ）チャネル生成機能と非決定的選択機能を持つタプル空間型ルータ２-iに送受信リ        クエストを登録するための図１７に示す命令pexecd
（ニ）データ送信実行部１０及びデータ受信実行部１１を実行するための図１８に示す        命令
などの命令を解釈実行する機能を持つ。
【０１３２】
ただし、図１８に示す命令は、別スレッドを新規生成して実行される。たとえば、プログラム格納用メモリのプログラムカウンタが指し示すアドレスに、次の命令（この命令の内容については後述する）
senderTop("/etc/hosts",
cons(ch("host","senderA.domainA",5050), 
cons(ch("hostname","senderA.domainA",5050),null)), 
ch("killch","senderA.domainA",5050))
が現れているとき、二つのスレッド（親スレッド、子スレッド）が生成され、親スレッドは、プログラム格納用メモリ領域内の上記命令の次の命令を実行し、子スレッドは、後述するデータ送信実行部１０の『データ送信手順１』からの実行を行う。
【０１３３】
なお、命令pexecNewChan及びpexecdについては、データ送信実行部１０やデータ受信実行部１１からも利用可能である。
【０１３４】
〔３−３〕データ送信実行部１０の処理
ライブラリ呼出しsenderTop(string,chanlst,killch)によって、トップレベル実行部１２によりデータ送信実行部１０が生成されると、その生成されたデータ送信実行部１０は、図１９に示すように、チャネルが一致しかつ受信を要求しているプログラム実行部１-iのデータ受信実行部１１に対してファイルを送信すべく、以下の動作を行う。
【０１３５】
ここで、senderTop の引数stringは送信するファイルのファイル名を表し、引数chanlst は受信相手の検索に用いられるチャネルのリストを表し、引数killchは送信処理終了の指示に用いられるチャネル（キルチャネル）を表している。
【０１３６】
また、図２０に、データ送信実行部１０及びデータ受信実行部１１が呼び出す評価関数searchDONE(x,y) の評価内容について記載しておく。
【０１３７】
〔３−３−１〕データ送信実行部１０の送信処理の概要
次に、データ送信実行部１０によるファイルデータの送信処理について説明する。
【０１３８】
図２１に、このファイルデータの送信処理の処理フローを図示する。
【０１３９】
この処理フローに示すように、データ送信実行部１０は、トップレベル実行部１２により生成されると、先ず最初に、ステップ２０で、秘密通信用の新規なチャネルを生成する。
【０１４０】
続いて、ステップ２１で、キルチャネル（終了信号用のチャネル）をチャネルとする終了指示受信のためのアクティブパートを生成する。
【０１４１】
続いて、ステップ２２で、ルータチャネルのリストをチャネルとする秘密通信用チャネル送信のためのアクティブパートを生成する。ここで、ルータチャネルのリストを生成するのは、ネットワーク上で、同一のファイルに対して異なるファイル名が付与されている場合があるので、それらのファイル名を考慮した形でルータチャネルを生成することに、その理由がある。
【０１４２】
続いて、ステップ２３で、ステップ２１，２２で生成したアクティブパートの集合を持つパッシブパートを生成して、それを自装置に接続されるタプル空間型ルータ２-iに登録する。
【０１４３】
続いて、ステップ２４で、自装置に接続されるタプル空間型ルータ２-iの記憶領域ＤＯＮＥに通信成功が記録されたのかを監視して、通信成功が記録されたことを検出するときには、ステップ２５に進んで、タプル空間型ルータ２-iに登録したパッシブパートに含まれるどのアクティブパートが通信に成功したのを特定する。
【０１４４】
この特定処理については、アクティブパートに対してパッシブパート内で一意のＩＤを割り付けるようにしているので（終了指示受信のためのアクティブパートには例えば１というＩＤを割り付ける）、通信に成功したアクティブパートのＩＤを抽出することで、それを特定することになる。
【０１４５】
続いて、ステップ２６で、この特定処理に従って、終了指示受信のためのアクティブパート（ステップ２１で生成したアクティブパート）が通信に成功したのか否かを判断して、終了指示受信のためのアクティブパートが通信に成功したことを判断するときには、ステップ２７に進んで、データ送信を終了する。
【０１４６】
ここで、終了指示受信のためのアクティブパートが通信に成功するために必要となるアクティブパート（同じキルチャネルを持つ送信要求のアクティブパート）については、自装置のプログラム実行部１-iが例えば規定の時間経過を判断するときに生成して、タプル空間型ルータ２-iに登録することになる。
【０１４７】
一方、ステップ２６で、終了指示受信のためのアクティブパートが通信に成功したものではないことを判断するとき、すなわち、秘密通信用チャネル送信のためのアクティブパート（ステップ２２で生成したいずれかのアクティブパート）が通信に成功したことを判断するときには、ステップ２８に進んで、送信するファイルをオープンしてファイルデータを読み出す。
【０１４８】
続いて、ステップ２９で、ステップ２０で生成した秘密通信用チャネルをチャネルとするファイルデータ送信のためのアクティブパートを生成し、続くステップ３０で、その生成したアクティブパートを持つパッシブパートを生成して、それを自装置に接続されるタプル空間型ルータ２-iに登録する。
【０１４９】
続いて、ステップ３１で、自装置に接続されるタプル空間型ルータ２-iの記憶領域ＤＯＮＥに通信成功が記録されたのかを監視して、通信成功が記録されたことを検出するとき、すなわち、ファイルデータの送信に成功したことを判断するときには、ステップ３２に進んで、オープンした送信ファイルをクローズしてから、別のプログラム実行部１-iへファイルデータを送信すべく、ステップ２１に戻っていく。
【０１５０】
このようにして、データ送信実行部１０は、タプル空間型ルータ２-iを使い、図１に示したような形態でもってファイルデータを送信していくように処理するのである。
【０１５１】
なお、安全性を高めるために、秘密通信用チャネルをその都度生成していくようにすることも可能であり、この場合には、ステップ３２の処理を終了すると、ステップ２１に戻るのではなくてステップ２０に戻るように処理することになる。また、安全性が保証されているような環境下では、ステップ２３に戻るように処理することも可能である。
【０１５２】
〔３−３−２〕データ送信実行部１０の送信処理の詳細
次に、図２２及び図２３に従って、このデータ送信実行部１０の実行する詳細な手順について説明する。
【０１５３】
『データ送信手順１』
ローカル変数STfilename、STwkchlst 、STkillch、STlch 、STtmp 、STtmp2、STtmpfp 、STtmpWkchlst、STtmpRequest及びSTclientpasid のためのメモリを確保する。
【０１５４】
『データ送信手順２』
引数stringを評価して評価値を変数STfilenameに格納し、引数chanlst を評価して評価値を変数STwkchlst に格納し、引数killchを評価して評価値を変数STkillchに格納し、変数STlch に値nullを格納する。
【０１５５】
『データ送信手順３』
pexecNewChan()を評価し、評価結果を変数STlch 格納する。このデータ送信手順３が図２１の処理フローのステップ２０に相当する。
【０１５６】
『データ送信手順４』
変数STtmp に値nullを格納し、変数STtmp2に値１を格納し、変数STtmpfp に値nullを格納し、変数STtmpWkchlstに値nullを格納し、変数STtmpRequestに値nullを格納し、変数STclientpasid に値０を格納する。
【０１５７】
『データ送信手順５』
変数CLIENTpasid を評価し、評価結果を変数STclientpasid に書き込む。次に、CLIENTpasid ＋２を評価し、評価結果を変数CLIENTpasid に格納する。
【０１５８】
『データ送信手順６』
変数STwkchlst の値を変数STtmpWkchlstに格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<?,STkillch,null>>,STtmpRequest)
を評価し、評価結果を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果を変数STtmp2に格納する。このデータ送信手順５が図２１の処理フローのステップ２１に相当する。
【０１５９】
『データ送信手順７』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。比較結果が真ならば、データ送信手順１０に制御を移す。
【０１６０】
『データ送信手順８』
car(STtmpWkchlst) を評価し、評価結果を変数STtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<!,STtmp,STlch>>,STtmpRequest)
を評価し、評価結果を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、評価結果を変数STtmp2に格納する。さらに、cdr(STtmpWkchlst）を評価し、評価結果を変数STtmpWkchlstに格納する。
【０１６１】
『データ送信手順９』
データ送信手順７に制御を移す。このデータ送信手順７〜９が図２１の処理フローのステップ２２に相当する。
【０１６２】
『データ送信手順１０』
pexecd(STtmpRequest)を評価する。このデータ送信手順１０が図２１の処理フローのステップ２３に相当する。
【０１６３】
『データ送信手順１１』
searchDONE(STclientpasid,DONE)を評価し、評価結果をSTtmp に格納する。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。比較結果が真ならば、データ送信手順１１に制御を移す（繰り返す）。比較結果が偽ならば、変数STclientpasid の値を１だけ増加して、その結果を変数STclientpasid に格納する。このデータ送信手順１１が図２１の処理フローのステップ２４に相当する。
【０１６４】
『データ送信手順１２』
delete(STtmp,DONE)を評価し、評価結果を変数DONEに格納する。
【０１６５】
『データ送信手順１３』
STtmp.retactを評価し、評価結果をSTtmp に格納する。次に、STtmp.aID を評価し、評価結果をSTtmp に格納する。このデータ送信手順１３が図２１の処理フローのステップ２５に相当する。
【０１６６】
『データ送信手順１４』
変数STtmp が１か比較し、評価結果をSTtmp2に格納する。評価結果が真ならば、データ送信実行部１０を終了する。このデータ送信手順１４が図２１の処理フローのステップ２６／ステップ２７に相当する。
【０１６７】
『データ送信手順１５』
open(STfilename)を評価し、評価結果をSTtmpfp に格納する。次に、変数STtmp に値nullを格納する。このデータ送信手順１５が図２１の処理フローのステップ２８のファイルオープ処理に相当する。
【０１６８】
『データ送信手順１６』
read(STtmpfp) を評価し、評価結果をSTtmp に格納する。このデータ送信手順１６が図２１の処理フローのステップ２８のファイルリード処理に相当する。
【０１６９】
『データ送信手順１７』
変数STtmpRequestに値nullを格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,1,
<!,STlch,STtmp>>,STtmpRequest)
を評価し、評価結果を変数STtmpRequestに格納する。このデータ送信手順１７が図２１の処理フローのステップ２９に相当する。
【０１７０】
『データ送信手順１８』
pexecd(STtmpRequest)を評価する。このデータ送信手順１８が図２１の処理フローのステップ３０に相当する。
【０１７１】
『データ送信手順１９』
searchDONE(STclientpasid,DONE)を評価し、評価結果をSTtmp に格納する。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。比較結果が真ならば、データ送信手順１９に制御を移す（繰り返す）。このデータ送信手順１９が図２１の処理フローのステップ３１に相当する。
【０１７２】
『データ送信手順２０』
close(STtmpfp)を評価する。このデータ送信手順２０が図２１の処理フローのステップ３２に相当する。
【０１７３】
『データ送信手順２１』
データ送信手順４に制御を移す。
【０１７４】
このようにして、データ送信実行部１０は、図２２及び図２３に示すデータ送信手順に従って、タプル空間型ルータ２-iを使い、図１に示したような形態でもってファイルデータを送信していくように処理するのである。
【０１７５】
〔３−４〕データ受信実行部１１の処理
ライブラリ呼出しreceiverTop(chanlst,killch,id)によって、トップレベル実行部１２によりデータ受信実行部１１が生成されると、その生成されたデータ受信実行部１１は、送信されてくるファイルを受信すべく、以下の動作を行う。
【０１７６】
ここで、receiverTop の引数chanlst は送信相手の検索に用いられるチャネルのリストを表し、引数killchは受信処理終了の指示に用いられるチャネル（キルチャネル）を表し、引数idは受信したファイルデータの識別用に用いられる識別子を表している。
【０１７７】
〔３−４−１〕データ受信実行部１１の受信処理の概要
図２４に、このファイルデータの受信処理の処理フローを図示する。
【０１７８】
この処理フローに示すように、データ受信実行部１１は、トップレベル実行部１２により生成されると、先ず最初に、ステップ４０で、キルチャネル（終了信号用のチャネル）をチャネルとする終了指示受信のためのアクティブパートを生成する。
【０１７９】
続いて、ステップ４１で、ルータチャネルのリストをチャネルとする秘密通信用チャネル受信のためのアクティブパートを生成する。ここで、ルータチャネルのリストを生成するのは、ネットワーク上で、受信対象のファイルを管理しているサイト（プログラム実行部１-i）が複数あるので、それらのサイト名を考慮した形でルータチャネルを生成することに、その理由がある。
【０１８０】
続いて、ステップ４２で、ステップ４０，４１で生成したアクティブパートの集合を持つパッシブパートを生成して、それを自装置に接続されるタプル空間型ルータ２-iに登録する。
【０１８１】
続いて、ステップ４３で、自装置に接続されるタプル空間型ルータ２-iの記憶領域ＤＯＮＥに通信成功が記録されたのかを監視して、通信成功が記録されたことを検出するときには、ステップ４４に進んで、タプル空間型ルータ２-iに登録したパッシブパートに含まれるどのアクティブパートが通信に成功したのを特定する。
【０１８２】
この特定処理については、送信側がアクティブパートに対してパッシブパート内で一意のＩＤを割り付けるようにしているので（終了指示受信のためのアクティブパートには例えば１というＩＤが割り付けられる）、通信に成功したアクティブパートのＩＤを抽出することで、それを特定することになる。
【０１８３】
続いて、ステップ４５で、この特定処理に従って、終了指示受信のためのアクティブパート（ステップ４０で生成したアクティブパート）が通信に成功したのか否かを判断して、終了指示受信のためのアクティブパートが通信に成功したことを判断するときには、ステップ４６に進んで、データ受信を終了する。
【０１８４】
ここで、終了指示受信のためのアクティブパートが通信に成功するために必要となるアクティブパート（同じキルチャネルを持つ送信要求のアクティブパート）については、自装置のプログラム実行部１-iが例えば規定の時間経過を判断するときに生成して、タプル空間型ルータ２-iに登録することになる。
【０１８５】
一方、ステップ４５で、終了指示受信のためのアクティブパートが通信に成功したものではないことを判断するとき、すなわち、秘密通信用チャネル受信のためのアクティブパート（ステップ４１で生成したいずれかのアクティブパート）が通信に成功したことを判断するときには、ステップ４７に進んで、受信した秘密通信用チャネルを取り出す。
【０１８６】
続いて、ステップ４８で、その取り出した秘密通信用チャネルをチャネルとするファイルデータ受信のためのアクティブパートを生成し、続くステップ４９で、その生成したアクティブパートを持つパッシブパートを生成して、それを自装置に接続されるタプル空間型ルータ２-iに登録する。
【０１８７】
続いて、ステップ５０で、自装置に接続されるタプル空間型ルータ２-iの記憶領域ＤＯＮＥに通信成功が記録されたのかを監視して、通信成功が記録されたことを検出するとき、すなわち、ファイルデータの受信に成功したことを判断するときには、ステップ５１に進んで、受信したファイルデータを保存して、データ受信を終了する。
【０１８８】
このようにして、データ受信実行部１１は、タプル空間型ルータ２-iを使い、図１に示したような形態でもってファイルデータを受信していくように処理するのである。
【０１８９】
〔３−４−２〕データ受信実行部１１の送信処理の詳細
次に、図２５及び図２６に従って、このデータ受信実行部１１の実行する詳細な手順について説明する。
【０１９０】
『データ受信手順１』
ローカル変数RTwkchlst 、RTkillch、RTid、RTlch 、RTtmp 、RTtmp2、RTtmpWkchlst、RTtmpRequest及びRTclientpasid のためのメモリを確保する。
【０１９１】
『データ受信手順２』
引数chanlst を評価して評価値を変数RTwkchlst に格納し、引数killchを評価して評価値を変数RTkillchに格納し、引数idを評価して評価値を変数RTidに格納し、変数RTlch に値nullを格納する。次に、変数RTtmp に値nullを格納し、変数RTtmp2に値１を格納し、変数RTtmpWkchlstに値nullを格納し、変数RTtmpRequestに値nullを格納し、変数RTclientpasid に値０を格納する。
【０１９２】
『データ受信手順３』
変数CLIENTpasid を評価し、評価結果を変数RTclientpasid に書き込む。次に、CLIENTpasid ＋２を評価し、評価結果を変数CLIENTpasid に格納する。
【０１９３】
『データ受信手順４』
変数RTwkchlst の値を変数RTtmpWkchlstに格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,RTtmp2, 
<?,RTkillch,null>>,RTtmpRequest)
を評価し、評価結果を変数RTtmpRequestに格納する。さらに、変数RTtmp2の値を１だけ増加して、その結果を変数RTtmp2に格納する。このデータ受信手順４が図２４の処理フローのステップ４０に相当する。
【０１９４】
『データ受信手順５』
変数RTtmpWkchlstが空リストnullか比較し、比較結果を変数RTtmp に格納する。比較結果が真ならば、データ受信手順８に制御を移す。
【０１９５】
『データ受信手順６』
car(RTtmpWkchlst) を評価し、評価結果を変数RTtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,RTtmp2, 
<?,RTtmp,null>>,RTtmpRequest)
を評価し、評価結果を変数RTtmpRequestに格納する。さらに、変数RTtmp2の値を１だけ増加して、評価結果を変数RTtmp2に格納する。さらに、cdr(RTtmpWkchlst) を評価し、評価結果を変数RTtmpWkchlstに格納する。
【０１９６】
『データ受信手順７』
データ受信手順５に制御を移す。このデータ受信手順５〜７が図２４の処理フローのステップ４１に相当する。
【０１９７】
『データ受信手順８』
pexecd(RTtmpRequest)を評価する。このデータ受信手順８が図２４の処理フローのステップ４２に相当する。
【０１９８】
『データ受信手順９』
searchDONE(RTclientpasid,DONE)を評価し、評価結果をRTtmp に格納する。次に、変数RTtmp がnullか比較し、比較結果を変数RTtmp2に格納する。比較結果が真ならば、データ受信手順９に制御を移す（繰り返す）。比較結果が偽ならば、変数RTclientpasid の値を１だけ増加して、評価結果を変数RTclientpasid に格納する。このデータ受信手順９が図２４の処理フローのステップ４３に相当する。
【０１９９】
『データ受信手順１０』
RTtmp.retactを評価し、評価結果をRTtmp に格納する。次に、RTtmp.aID を評価し、評価結果をRTtmp に格納する。このデータ受信手順１０が図２４の処理フローのステップ４４に相当する。
【０２００】
『データ受信手順１１』
変数RTtmp が１か比較し、評価結果をRTtmp2に格納する。評価結果が真ならば、データ受信実行部１１を終了する。このデータ受信手順１１が図２４の処理フローのステップ４５／ステップ４６に相当する。
【０２０１】
『データ受信手順１２』
RTtmp.retvalueを評価し、変数RTlch に格納する。このデータ受信手順１２が図２４の処理フローのステップ４７に相当する。
【０２０２】
『データ受信手順１３』
変数RTtmpRequestに値nullを格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,1,
<?,RTlch,null>> ,RTtmpRequest)
を評価し、評価結果を変数RTtmpRequestに格納する。このデータ受信手順１３が図２４の処理フローのステップ４８に相当する。
【０２０３】
『データ受信手順１４』
pexecd（RTtmpRequest）を評価する。このデータ受信手順１４が図２４の処理フローのステップ４９に相当する。
【０２０４】
『データ受信手順１５』
searchDONE(RTclientpasid,DONE)を評価し、評価結果をRTtmp に格納する。次に、変数RTtmp がnullか比較し、比較結果を変数RTtmp2に格納する。比較結果が真ならば、データ受信手順１５に制御を移す（繰り返す）。このデータ受信手順１５が図２４の処理フローのステップ５０に相当する。
【０２０５】
『データ受信手順１６』
cons(<RTid,RTtmp.retvalue>,recvDat) を評価し、評価結果を変数recvDat に格納する。このデータ受信手順１６が図２４の処理フローのステップ５１に相当する。
【０２０６】
『データ受信手順１７』
データ受信実行部１１を終了する。
【０２０７】
このようにして、データ受信実行部１１は、図２５及び図２６に示すデータ送信手順に従って、タプル空間型ルータ２-iを使い、図１に示したような形態でもってファイルデータを受信していくように処理するのである。
【実施例】
【０２０８】
次に、これまでに説明した本発明の処理について具体的に説明する。
【０２０９】
以下に説明する実施例では、ネットワークに接続されたホストとして、
・"senderA.domainA" （senderA と略記する）
・"receiverB.domainB" （receiverB と略記する）
があることを想定する。
【０２１０】
ここで、senderA 及びreceiverB には、プログラム実行部１-iがひとつ動作しているものとし（それぞれをプログラム実行部Ａ、プログラム実行部Ｂと呼ぶ）、これらのプログラム実行部Ａ，Ｂは、
・プログラム実行部Ａ："senderA.domainA" 上のファイル"/etc/hosts"を送信する
・プログラム実行部Ｂ：ファイル"/etc/hosts"を受信する
という機能を達成するためのものであるとする。
【０２１１】
ただし、"hosts" についてはネットワーク上で"hostname"も使用されていることがあることを想定している。また、受信側のホストは、"senderA.domainA" からファイルを受信してもよいし、それとは別の"senderC.domainC" からファイルを受信してもよいことを想定している。
【０２１２】
以下、説明の便宜上、プログラム実行部Ａのアドレスを110425630970810(ＩＰアドレスは100.110.120.130 で、ポート番号は5050）とし、プログラム実行部Ｂのアドレスを11081521566600（ＩＰアドレスは10.20.30.40 で、ポート番号は5000）とする。また、senderA 、receiverB には、それぞれ、プログラム実行部Ａ、Ｂに接続されたチャネル生成機能と非決定的選択機能を持つタプル空間型ルータ２-iが既に動作しているとする。
【０２１３】
〔１〕送信側の処理
〔１−１〕プログラム実行部Ａの処理
以下に、プログラム実行部Ａの具体的な処理について示す。
【０２１４】
プログラム実行部Ａは、
（ｉ）値nullを変数recvDat に格納し、プログラム実行部Ａの動作するＩＰアドレスとポ−ト番号から生成されるアドレス110425630970810 を変数CLIENTadrsに格納し、値０を変数CLIENTpasid に格納してから、
（ii）トップレベル実行部１２を起動する、
という処理を実行する。
【０２１５】
このようにして、プログラム実行部Ａは、トップレベル実行部１２（トップレベル実行部Ａと呼ぶ）を起動するのである。
【０２１６】
ここで、プログラム実行部Ａの変数progには、二つのインデックス情報
<"hosts","senderA.domainA",5050> 、<"hostname","senderA.domainA",5050> 
から生成されるチャネル
ch("hosts","senderA.domainA",5050) 、ch("hostname","senderA.domainA",5050）
を使った通信が可能なデータ受信側のプログラム実行部１-iに対して、ホストsenderA.domainA 上のファイル/etc/hostsを転送するという機能を果たすプログラムコードがあらかじめ投入されているとする。ただし、このファイル転送は１時間（すなわち、3600秒間）だけ行われ、１時間が経過した後は、終了するものとする。
【０２１７】
〔１−２〕トップレベル実行部Ａの処理
以下、変数prog内のプログラムコードに基づくトップレベル実行部Ａの具体的な処理について示す。
【０２１８】
『トップレベル実行処理Ａ１』
ローカル変数forProgAstring、forProgAchanlst 、forProgAkillch、forProgACLIENTpasid 及びforProgAtmp のためのメモリ領域を確保し、初期値としてそれぞれにnullを格納する。
【０２１９】
『トップレベル実行処理Ａ２』
変数forProgAstringに、値"/etc/hosts"を格納する。
【０２２０】
『トップレベル実行処理Ａ３』
ch("hosts","senderA.domainA",5050)を評価し、評価結果<1l0425630970810,"hosts"> を変数forProgAtmp に格納する。次に、cons(forProgAtmp,forProgAchanlst）を評価し、評価結果cons(<110425630970810,"hosts">,null)、すなわち、リスト
(<110425630970810,"hosts">) 
を変数forProgAchanlst に格納する。
【０２２１】
『トップレベル実行処理Ａ４』
ch("hostname","senderA.domainA",5050) を評価し、評価結果<110425630970810,"hostname">を変数forProgAtmp に格納する。次に、cons(forProgAtmp,forProgAchanlst）を評価し、評価結果
(<110425630970810,"hostname"><110425630970810,"hosts">) 
を変数forProgAchanlst に格納する。
【０２２２】
『トップレベル実行処理Ａ５』
ch("killch","senderA.domainA",5050) を評価し、評価結果
<1104256309708l0,"killch">
を変数forProgAkillchに格納する。
【０２２３】
『トップレベル実行処理Ａ６』
変数CLIENTpasid を評価し、評価結果０を変数forProgACLIENTpasid に格納する。次に、CLIENTpasid ＋１を評価し、評価結果１を変数CLIENTpasid に格納する。
【０２２４】
『トップレベル実行処理Ａ７』
データ送信実行部１０を生成する命令
senderTop(forProgAstring,forProgAchanlst,forProgAkillch)
を評価する。以下では、この命令により生成されたデータ送信実行部１０をデータ送信実行部Ａと呼ぶ。具体的には、命令
senderTop("/etc/hosts", 
(<110425630970810,"hostname"><110425630970810,"hosts">),
<1104256309708l0,"killch">)
の実行である。
【０２２５】
『トップレベル実行処理Ａ８』
３６００秒間スリープする。
【０２２６】
『トップレベル実行処理Ａ９』
cons(<CLIENTadrs,CLIENTadrs,forProgACLIENTpasid,1,<!,forProgAkillch,0>>,null) を評価し、評価結果
(<110425630970810,110425630970810,0,1,<!,<110425630970810,"killch">,0>>)
を変数forProgAtmp に格納する。
【０２２７】
『トップレベル実行処理Ａ１０』
pexecd(forProgAtmp) を評価する。これは、命令
pexecd((<110425630970810,110425630970810,0,1, 
<!,<110425630970810,"killch">,0>>))
の実行である。この命令の実行によって、トップレベル実行処理Ａ７で生成されたデータ送信実行部Ａが消去される。
【０２２８】
『トップレベル実行処理Ａ１１』
処理を終了する。
【０２２９】
〔１−３〕データ送信実行部Ａの処理
以下、データ送信実行部Ａの具体的な処理について示す。
【０２３０】
トップレベル実行部Ａにより生成された上述の命令
senderTop("/etc/hosts", 
(<110425630970810,"hostname"><110425630970810,"hosts">),
<1104256309708l0,"killch">)
の実行を、以下に示す。
【０２３１】
この命令によって、新規スレッド上にデータ送信実行部Ａが生成され、次の手順で処理が行われる。実行直前において、トップレベル実行部Ａの処理における上述のトップレベル実行処理Ａ６から、変数CLIENTpasid に格納されている値は１である。
【０２３２】
『データ送信処理１』
ローカル変数STfilename、STwkchlst 、STkillch、STlch 、STtmp 、STtmp2、STtmpfp 、STtmpWkchlst、STtmpRequest及びSTclientpasid のためのメモリを確保する。
【０２３３】
『データ送信処理２』
引数stringを評価して評価値"/etc/hosts"を変数STfilenameに格納し、引数chanlst を評価して評価値(<110425630970810,"hostname"><110425630970810,"hosts">) を変数STwkchlst に格納し、引数killchを評価して評価値<1104256309708l0,"killch">を変数STkillchに格納し、変数STlch に値nullを格納する。
【０２３４】
『データ送信処理３』
pexecNewChan()を評価し、評価結果（<110425630970810,10>とする）を変数STlch に格納する。
【０２３５】
『データ送信処理４』
変数STtmp に値nullを格納し、変数STtmp2に値１を格納し、変数STtmpfp に値nullを格納し、変数STtmpWkchlstに値nullを格納し、変数STtmpRequestに値nullを格納し、変数STclientpasid に値０を格納する。
【０２３６】
『データ送信処理５』
変数CLIENTpasid を評価し、評価結果１を変数STclientpasid に書き込む。次に、CLIENTpasid ＋２を評価し、評価結果３を変数CLIENTpasid に格納する。
【０２３７】
『データ送信処理６』
変数STwkchlst の値(<110425630970810,"hostname"><110425630970810,"hosts">) を、変数STtmpWkchlstに格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<?,STkillch,null>> ,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,1,1,
<?,<110425630970810,"killch">,null>>,null)
を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果２を変数STtmp2に格納する。
【０２３８】
『データ送信処理７』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。変数STtmpWkchlstの値は(<110425630970810,"hostname"><110425630970810,"hosts">) なので、比較結果は偽である。
【０２３９】
『データ送信処理８』
car(STtmpWkchlst) を評価し、評価結果<110425630970810,"hostname">を変数STtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<!,STtmp,STlch>>,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,1,2,
<!,<110425630970810,"hostname">,<110425630970810,10>>>, 
cons(<110425630970810,110425630970810,1,1,
<?,<110425630970810,"killch">,null>>,null)) 
を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果３を変数STtmp2に格納する。さらに、cdr(STtmpWkchlst）を評価し、評価結果(<110425630970810,"hosts">) を変数STtmpWkchlstに格納する。
【０２４０】
『データ送信処理９』
データ送信処理１０に制御を移す。
【０２４１】
『データ送信処理１０』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。変数STtmpWkchlstの値は(<110425630970810,"hosts">) なので、比較結果は偽である。
【０２４２】
『データ送信処理１１』
car(STtmpWkchlst）を評価し、評価結果<110425630970810,"hosts"> を変数STtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<!,STtmp,STlch>>,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,1,3,
<!,<110425630970810,"hosts">,<110425630970810,10>>>,
cons(<110425630970810,110425630970810,1,2,
<!,<110425630970810,"hostname">,<110425630970810,10>>>, 
cons(<110425630970810,110425630970810,1,1,
<?,<110425630970810,"killch">,null>>,null)))
を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果４を変数STtmp2に格納する。さらに、cdr(STtmpWkchlst）を評価し、評価結果nullを変数STtmpWkchlstに格納する。
【０２４３】
『データ送信処理１２』
データ送信処理１３に制御を移す。
【０２４４】
『データ送信処理１３』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。比較結果は真であるので、データ送信処理１４に制御を移す。
【０２４５】
『データ送信処理１４』
pexecd(STtmpRequest)を評価する。すなわち、
pexecd( 
cons(<110425630970810,110425630970810,1,3,
<!,<110425630970810,"hosts">,<110425630970810,10>>>,
cons(<110425630970810,110425630970810,1,2,
<!,<110425630970810,"hostname">,<110425630970810,10>>>, 
cons(<110425630970810,110425630970810,1,1,
<?,<110425630970810,"killch">,null>>,null)))) 
を実行する。
【０２４６】
さて、ここで、この通信リクエストに基づく通信の結果を待つ。具体的には、上述した「データ送信実行部の動作説明における“データ送信手順１１”」にしたがって、searchDONE(STclientpasid,DONE)を評価して評価結果をSTtmp に格納し、変数STtmp がnullか比較して比較結果を変数STtmp2に格納する、という一連の処理を、変数STtmp2の値が偽になるまで繰り返す。
【０２４７】
『データ送信処理１５』
searchDONE(STclientpasid,DONE)を評価し、評価結果（ここでは、変数DONEの値がnullとする。このとき、searchDONE(STclientpasid,DONE)の評価結果もnullである）をSTtmp に格納する。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。比較結果が真なので、データ送信処理１６に制御を移す。
【０２４８】
『データ送信処理１６』
searchDONE(STclientpasid,DONE)を評価し、評価結果をSTtmp に格納する。ここでは、変数DONEの値が図２７（ａ）に示すものであるとする。このとき、searchDONE(STclientpasid,DONE)の評価結果は図２７（ｂ）に示すものとなる。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。ここでは比較結果が偽なので、変数STclientpasid の値を１だけ増加して、その結果２を変数STclientpasid に格納する。
【０２４９】
『データ送信処理１７』
delete(STtmp,DONE)を評価し、評価結果を変数DONEに格納する。ここでは、図２８に示すような評価を行うので、評価結果nullを変数DONEに格納することになる。
【０２５０】
『データ送信処理１８』
STtmp.retactを評価し、評価結果
<110425630970810,110425630970810,1,3, 
<!,<110425630970810,"hosts">,<110425630970810,10>>>
をSTtmp に格納する。次に、STtmp.aID を評価し、評価結果３をSTtmp に格納する。
【０２５１】
『データ送信処理１９』
変数STtmp が１か比較し、評価結果をSTtmp2に格納する。ここでは、評価結果は偽である。
【０２５２】
『データ送信処理２０』
open("/etc/hosts")を評価し、評価結果（返値となるファイルディスクリプタを112233とする）をSTtmpfp に格納する。次に、変数STtmp に値nullを格納する。
【０２５３】
『データ送信処理２１』
read(112233)を評価し、評価結果をSTtmp に格納する。ここでは、評価結果として要素数１のリスト"senderA.domainA 100.110.120.130" とし、これをSTtmp に格納するとする。
【０２５４】
『データ送信処理２２』
変数STtmpRequestに値nullを格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,1,
<!,STlch,STtmp>>,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,2,1,
<!,<110425630970810,10>,("senderA.domainA 100.110.120.130")>>,null）
を変数STtmpRequestに格納する。
【０２５５】
『データ送信処理２３』
pexecd(STtmpRequest)を評価する。すなわち、
pexecd( 
cons(<110425630970810,110425630970810,2,1,
<!,<110425630970810,10>,("senderA.domainA 100.110.120.130")>>,null))
を実行する。
【０２５６】
さて、ここで、この通信リクエストに基づく通信の結果を待つ。具体的には、上述した「データ送信実行部の動作説明における“データ送信手順１９”」にしたがって、searchDONE(STclientpasid,DONE)を評価して評価結果をSTtmp に格納し、変数STtmp がnullか比較して比較結果を変数STtmp2に格納する、という一連の処理を、変数STtmp2の値が偽になるまで繰り返す。
【０２５７】
『データ送信処理２４』
searchDONE(STclientpasid,DONE)を評価し、評価結果（ここでは、変数DONEの値がnullとする。このとき、searchDONE(STclientpasid,DONE)の評価結果もnullである）をSTtmp に格納する。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。比較結果が真なので、データ送信処理２５に制御を移す。
【０２５８】
『データ送信処理２５』
searchDONE(STclientpasid,DONE)を評価し、評価結果をSTtmp に格納する。ここでは、変数DONEの値が図２９（ａ）に示すものであるとする。このとき、searchDONE(STclientpasid,DONE)の評価結果は図２９（ｂ）に示すものとなる。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。ここでは比較結果が偽である。
【０２５９】
『データ送信処理２６』
close(112233）を評価する。
【０２６０】
ここまでで、"/etc/hosts"ファイルの一回の送信が完了した（「データ送信実行部」の動作説明における“データ送信手順２１”に実行が到達している）。ここで、トップレベル実行部Ａの動作における上述したトップレベル実行処理Ａ８（3600秒間スリープする）が完了し、それに続くトップレベル実行処理Ａ９〜１１までが実行され、動作を終了したとする。その動作終了の直前、トップレベル実行処理Ａ１０において、チャネル<110425630970810,"killch">に値０を渡すためのリクエストが投入される。以下、「データ送信実行部」の動作説明における“データ送信手順４”に戻って、処理を続ける。
【０２６１】
『データ送信処理２７』
変数STtmp に値nullを格納し、変数STtmp2に値１を格納し、変数STtmpfp に値nullを格納し、変数STtmpWkchlstに値nullを格納し、変数STtmpRequestに値nullを格納し、変数STclientpasid に値０を格納する。
【０２６２】
『データ送信処理２８』
変数CLIENTpasid を評価し、評価結果３を変数STclientpasid に書き込む。次に、CLIENTpasid ＋2 を評価し、評価結果５を変数CLIENTpasid に格納する。
【０２６３】
『データ送信処理２９』
変数STwkchlst の値(<110425630970810,"hostname"><110425630970810,"hosts">) を、変数STtmpWkchlstに格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<?,STkillch,null>>,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,3,1 
<?,<110425630970810,"killch">,null>>,null)
を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果２を変数STtmp2に格納する。
【０２６４】
『データ送信処理３０』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。変数STtmpWkchlstの値は(<110425630970810,"hostname"><110425630970810,"hosts">) なので、比較結果は偽である。
【０２６５】
『データ送信処理３１』
car(STtmpWkchlst) を評価し、評価結果<110425630970810,"hostname">を変数STtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<!,STtmp,STlch>>,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,3,2,
<!,<110425630970810,"hostname">,<110425630970810,10>>>, 
cons(<110425630970810,110425630970810,3,1,
<?,<110425630970810,"killch">,null>>,null)) 
を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果３を変数STtmp2に格納する。さらに、cdr(STtmpWkchlst）を評価し、評価結果(<110425630970810,"hosts">) を変数STtmpWkchlstに格納する。
【０２６６】
『データ送信処理３２』
データ送信処理３３に制御を移す。
【０２６７】
『データ送信処理３３』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。変数STtmpWkchlstの値は(<110425630970810,"hosts">) なので、比較結果は偽である。
【０２６８】
『データ送信処理３４』
car(STtmpWkchlst）を評価し、評価結果<110425630970810,"hosts"> を変数STtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,STclientpasid,STtmp2, 
<!,STtmp,STlch>>,STtmpRequest)
を評価し、評価結果
cons(<110425630970810,110425630970810,3,3,
<!,<110425630970810,"hosts">,<110425630970810,10>>>,
cons(<110425630970810,110425630970810,3,2,
<!,<110425630970810,"hostname">,<110425630970810,10>>>, 
cons(<110425630970810,110425630970810,3,1,
<?,<110425630970810,"killch">,null>>,null)))
を変数STtmpRequestに格納する。さらに、変数STtmp2の値を１だけ増加して、その結果４を変数STtmp2に格納する。さらに、cdr(STtmpWkchlst) を評価し、評価結果nullを変数STtmpWkchlstに格納する。
【０２６９】
『データ送信処理３５』
データ送信処理３６に制御を移す。
【０２７０】
『データ送信処理３６』
変数STtmpWkchlstが空リストnullか比較し、比較結果を変数STtmp に格納する。比較結果は真であるので、データ送信処理３７に制御を移す。
【０２７１】
『データ送信処理３７』
pexecd(STtmpRequest)を評価する。すなわち、
pexecd( 
cons(<110425630970810,110425630970810,3,3,
<!,<110425630970810,"hosts">,<110425630970810,10>>>,
cons(<110425630970810,110425630970810,3,2,
<!,<110425630970810,"hostname">,<110425630970810,10>>>, 
cons(<110425630970810,110425630970810,3,1,
<?,<110425630970810,"killch">,null>>,null)))) 
を実行する。
【０２７２】
上述したトップレベル実行部Ａのトップレベル実行処理Ａ１０において、チャネル<110425630970810,"killch">に値０を渡すためのリクエストが投入されている。チャネル生成機能と非決定的選択機能を持つタプル空間型ルータ２-iは、このトップレベル実行部Ａからのリクエストとデータ送信処理３７のリクエストとを受け付け、変数DONEに、図３０（ａ）に示すような通信処理結果を投入する。
【０２７３】
『データ送信処理３８』
searchDONE(STclientpasid,DONE)を評価し、評価結果をSTtmp に格納する。ここでは、変数DONEの値が図３０（ａ）に示すものであるとしているので、searchDONE(STclientpasid,DONE)の評価結果は図３０（ｂ）に示すものとなる。次に、変数STtmp がnullか比較し、比較結果を変数STtmp2に格納する。ここでは比較結果が偽なので、変数STclientpasid の値を１だけ増加して、その結果２を変数STclientpasid に格納する。
【０２７４】
『データ送信処理３９』
delete(STtmp,DONE)を評価し、評価結果を変数DONEに格納する。ここでは、図３１に示すような評価を行うので、評価結果nullを変数DONEに格納することになる。
【０２７５】
『データ送信処理４０』
STtmp.retactを評価し、評価結果
<1110425630970810,110425630970810,3,1,
<?,<110425630970810,"killch">,null>> 
をSTtmp に格納する。次に、STtmp.aID を評価し、評価結果１をSTtmp に格納する。
【０２７６】
『データ送信処理４１』
変数STtmp が１か比較し、評価結果をSTtmp2に格納する。評価結果が真なので、データ送信実行部Ａを終了する。
【０２７７】
〔２〕受信側の処理
〔２−１〕プログラム実行部Ｂの処理
以下に、プログラム実行部Ｂの具体的な処理について示す。
【０２７８】
プログラム実行部Ｂは、
（ｉ）値nullを変数recvDat に格納し、プログラム実行部Ｂの動作するＩＰアドレスとポ−ト番号から生成されるアドレス11081521566600を変数CLIENTadrsに格納し、値０を変数CLIENTpasid に格納してから、
（ii）トップレベル実行部１２を起動する、
という処理を実行する。
【０２７９】
このようにして、プログラム実行部Ｂは、トップレベル実行部１２（トップレベル実行部Ｂと呼ぶ）を起動するのである。
【０２８０】
ここで、プログラム実行部Ｂの変数progには、二つのインデックス情報
<"hosts","senderA.domainA",5050>  、<"hosts","senderC.domainC",10000> 
から生成されるチャネル
ch("hosts","senderA.domainA",5050) 、ch("hosts","senderC.domainC",10000) 
を使った通信が可能なデータ送信側プログラム実行部１-iから、ファイル/etc/hostsの受信成功を待って、どちらか片方のみからデータを１回だけ受信し、その受信に成功すると、ファイル/etc/hosts-received を新規作成して受信結果をセーブし終了するという機能を果たすプログラムコードがあらかじめ投入されているとする。
【０２８１】
以下、説明の便宜上、ホスト"senderC.domainC" のＩＰアドレスは200.210.220.230 とする。このとき、ch("hosts","senderC.domainC",10000) の評価結果は<"hosts"，220807974758160>である。ただし、本実施例では、アドレス220807974758160 のプログラム実行部１-iは動作していないとする。
【０２８２】
〔２−２〕トップレベル実行部Ｂの処理
以下、変数prog内のプログラムコードに基づくトップレベル実行部Ｂの具体的な処理について示す。
【０２８３】
『トップレベル実行処理Ｂ１』
ローカル変数forProgBchanlst 、forProgBkillch、forProgBid、forProgBCLIENTpasid 及びforProgBtmp のためのメモリ領域を確保し、初期値としてそれぞれにnullを格納する。
【０２８４】
『トップレベル実行処理Ｂ２』
ch("hosts","senderA.domainA",5050)を評価し、評価結果<110425630970810,"hosts"> を変数forProgBtmp に格納する。次に、cons(forProgBtmp,forProgBchanlst) を評価し、評価結果cons(<110425630970810,"hosts">,null)、すなわち、リスト
(<110425630970810,"hosts">) 
を変数forProgBchanlst に格納する。
【０２８５】
『トップレベル実行処理Ｂ３』
ch("hosts","senderC.domainC",10000) を評価し、評価結果<220807974758160,"hosts"> を変数forProgBtmp に格納する。次に、cons(forProgBtmp,forProgBchanlst) を評価し、評価結果
(<220807974758160,"hosts"><110425630970810,"hosts">)
を変数forProgBchanlst に格納する。
【０２８６】
『トップレベル実行処理Ｂ４』
ch("killch","senderB.domainB",5000) を評価し、評価結果
<11081521566600,"killch"> 
を変数forProgBkillchに格納する。
【０２８７】
『トップレベル実行処理Ｂ５』
値０を変数forProgBidに格納する。
【０２８８】
『トップレベル実行処理Ｂ６』
変数CLIENTpasid を評価し、評価結果０を変数forProgBCLIENTpasid に格納する。次に、CLIENTpasid ＋１を評価し、評価結果１を変数CLIENTpasid に格納する。
【０２８９】
『トップレベル実行処理Ｂ７』
データ受信実行部１１を生成する命令
receiverTop(forProgBchanlst,forProgBkillch,forProgBid)
を評価する。以下では、この命令により生成されたデータ受信実行部１１をデータ受信実行部Ｂと呼ぶ。具体的には、命令
receiverTop((<220807974758160,"hosts"><110425630970810,"hosts">), 
<11081521566600,"killch">,0) 
の実行である。
【０２９０】
『トップレベル実行処理Ｂ８』
変数recvDat の値がnullでなくなるまで待つ。変数recvDat の値がnullでなくなったとき、変数recvDat の値は、ホストsenderA.domainA の持つ/etc/hostsファイルの内容を要素に持つリストである。トップレベル実行処理Ｂ７で生成した命令では、アドレス110425630970810 のプログラム実行部Ａとアドレス220807974758160 のプログラム実行部Ｃからのデータ受信を試みるが、アドレス220807974758160 のプログラム実行部Ｃは動作していないので、ホストsenderC.domainC からデータが送られる可能性はない。
【０２９１】
『トップレベル実行処理Ｂ９』
car(recvDat)を評価し、評価結果（senderA.domainA の/etc/hostsファイルの内容）を、変数recvDat に格納する。
【０２９２】
『トップレベル実行処理Ｂ１０』
ファイル/etc/hosts-received を新規作成し、変数recvDat の内容をそのファイルに書き込む。
【０２９３】
『トップレベル実行処理Ｂ１１』
処理を終了する。
【０２９４】
〔２−３〕データ受信実行部Ｂの処理
以下、データ受信実行部Ｂの具体的な処理について示す。
【０２９５】
トップレベル実行部Ｂにより生成された上述の命令
receiverTop((<220807974758160,"hosts"><110425630970810,"hosts">), 
<11081521566600,"killch">,0) 
の実行を、以下に示す。
【０２９６】
この命令によって、新規スレッド上にデータ受信実行部Ｂが生成され、次の手順で処理が行われる。実行直前において、トップレベル実行部Ｂの処理における上述のトップレベル実行処理Ｂ６から、変数CLIENTpasid に格納されている値は１である。
【０２９７】
『データ受信処理１』
ローカル変数RTwkchlst 、RTkillch、RTid、RTlch 、RTtmp 、RTtmp2、RTtmpWkchlst、RTtmpRequest及びRTclientpasid のためのメモリを確保する。
【０２９８】
『データ受信処理２』
引数chanlst を評価して評価値(<220807974758160,"hosts"><110425630970810,"hosts">)を変数RTwkchlst に格納し、引数killchを評価して評価値<11081521566600,"killch"> を変数RTkillchに格納し、引数idを評価して評価値０を変数RTidに格納し、変数RTlch に値nullを格納する。次に、変数RTtmp に値nullを格納し、変数RTtmp2に値１を格納し、変数RTtmpWkchlstに値nullを格納し、変数RTtmpRequestに値nullを格納し、変数RTclientpasid に値０を格納する。
【０２９９】
『データ受信処理３』
変数CLIENTpasid を評価し、評価結果１を変数RTclientpasid に書き込む。次に、CLIENTpasid ＋２を評価し、評価結果３を変数CLIENTpasid に格納する。
【０３００】
『データ受信処理４』
変数RTwkchlst の値(<220807974758160,"hosts"><110425630970810,"hosts">)を、変数RTtmpWkchlstに格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,RTtmp2, 
<?,RTkillch,null>>,RTtmpRequest)
を評価し、評価結果
cons(<11081521566600,11081521566600,0,1,
<?,<11081521566600,"killch">,null>>,null)
を変数RTtmpRequestに格納する。さらに、変数RTtmp2の値を１だけ増加して、その結果２を変数RTtmp2に格納する。
【０３０１】
『データ受信処理５』
変数RTtmpWkchlstが空リストnullか比較し、比較結果を変数RTtmp に格納する。比較結果は偽である。
【０３０２】
『データ受信処理６』
car(RTtmpWkchlst）を評価し、評価結果<220807974758160,"hosts"> を変数RTtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,RTtmp2, 
<?,RTtmp,null>>,RTtmpRequest)
を評価し、評価結果
cons(<11081521566600,11081521566600,0,2,
<?,<220807974758160,"hosts">,null>>,
cons(<11081521566600,11081521566600,0,1,
<?,<11081521566600,"killch">,null>>,null))
を変数RTtmpRequestに格納する。さらに、変数RTtmp2の値を１だけ増加して、その結果３を変数RTtmp2に格納する。さらに、cdr(RTtmpWkchlst) を評価し、評価結果<110425630970810,"hosts"> を変数RTtmpWkchlstに格納する。
【０３０３】
『データ受信処理７』
データ受信処理８に制御を移す。
【０３０４】
『データ受信処理８』
変数RTtmpWkchlstが空リストnullか比較し、比較結果を変数RTtmp に格納する。比較結果は偽である。
【０３０５】
『データ受信処理９』
car(RTtmpWkchlst）を評価し、評価結果<110425630970810,"hosts"> を変数RTtmp に格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,RTtmp2, 
<?,RTtmp,null>>,RTtmpRequest)
を評価し、評価結果
cons(<11081521566600,11081521566600,0,3,
<?,<110425630970810,"hosts">,null>>,
cons(<11081521566600,11081521566600,0,2,
<?,<220807974758160,"hosts">,null>>,
cons(<11081521566600,11081521566600,0,1,
<?,<11081521566600,"killch">,null>>,null))
を変数RTtmpRequestに格納する。さらに、変数RTtmp2の値を１だけ増加して、その結果４を変数RTtmp2に格納する。さらに、cdr(RTtmpWkchlst）を評価し、評価結果nullを変数RTtmpWkchlstに格納する。
【０３０６】
『データ受信処理１０』
データ受信処理１１に制御を移す。
【０３０７】
『データ受信処理１１』
変数RTtmpWkchlstが空リストnullか比較し、比較結果を変数RTtmp に格納する。比較結果が真であるので、データ受信処理１２に制御を移す。
【０３０８】
『データ受信処理１２』
pexecd(RTtmpRequest)を評価する。すなわち、
pexecd（
cons(<11081521566600,11081521566600,0,3,
<?,<110425630970810,"hosts">,null>>,
cons(<11081521566600,11081521566600,0,2,
<?,<220807974758160,"hosts">,null>>,
cons(<11081521566600,11081521566600,0,1,
<?,<11081521566600,"killch">,null>>,null))))
を実行する。
【０３０９】
さて、ここで、この通信リクエストに基づく通信の結果を待つ。具体的には、上述した「データ受信実行部の動作説明における“データ受信手順９”」にしたがって、searchDONE(RTclientpasid,DONE)を評価して評価結果をRTtmp に格納し、変数RTtmp がnullか比較して比較結果を変数RTtmp2に格納する、という一連の処理を、変数RTtmp2の値が偽になるまで繰り返す。
【０３１０】
『データ受信処理１３』
searchDONE(RTclientpasid,DONE)を評価し、結果（ここでは、変数DONEの値がnullとする。このとき、searchDONE(RTclientpasid,DONE)の評価結果もnullである) をRTtmp に格納する。次に、変数RTtmp がnullか比較し、比較結果を変数RTtmp2に格納する。比較結果が真なので、データ受信手順１４に制御を移す。
【０３１１】
『データ受信処理１４』
searchDONE(RTclientpasid,DONE)を評価し、評価結果をRTtmp に格納する。ここでは、変数DONEの値が図３２（ａ）に示すものであるとする。このとき、searchDONE(RTclientpasid,DONE)の評価結果は図３２（ｂ）に示すものとなる。次に、変数RTtmp がnullか比較し、比較結果を変数RTtmp2に格納する。比較結果が偽なので、変数RTclientpasid の値を１だけ増加して、その結果１を変数RTclientpasid に格納する。
【０３１２】
『データ受信処理１５』
RTtmp.retactを評価し、評価結果
<11081521566600,11081521566600,0,3,<?,<110425630970810,"hosts">,null>>,
をRTtmp に格納する。次に、RTtmp.aID を評価し、評価結果３をRTtmp に格納する。
【０３１３】
『データ受信処理１６』
変数RTtmp が１か比較し、評価結果をRTtmp2に格納する。評価結果は偽である。
【０３１４】
『データ受信処理１７』
RTtmp.retvalueを評価し、評価結果<110425630970810,10>を変数RTlch に格納する。
【０３１５】
『データ受信処理１８』
変数RTtmpRequestに値nullを格納する。次に、
cons(<CLIENTadrs,CLIENTadrs,RTclientpasid,1,<?,RTlch,null>>,RTtmpRequest）
を評価し、評価結果
cons(<11081521566600,11081521566600,1,1,
<?,<110425630970810,10>,null>>,null)
を変数RTtmpRequestに格納する。
【０３１６】
『データ受信処理１９』
pexecd(RTtmpRequest)を評価する。すなわち、
pexecd( 
cons(<11081521566600,11081521566600,1,1, 
<?,<110425630970810,10>,null>>,null))
を実行する。
【０３１７】
『データ受信処理２０』
searchDONE(RTclientpasid,DONE)を評価し、評価結果（ここでは、変数DONEの値がnullとする。このとき、searchDONE(RTclientpasid,DONE)の評価結果もnullである）をRTtmp に格納する。次に、変数RTtmp がnullか比較し、比較結果を変数RTtmp2に格納する。比較結果が真なので、データ受信処理２１に制御を移す。
【０３１８】
『データ受信処理２１』
searchDONE(RTclientpasid,DONE)を評価し、評価結果をRTtmp に格納する。ここでは、変数DONEの値が図３３（ａ）に示すものであるとする。このとき、searchDONE(RTclientpasid,DONE)の評価結果は図３３（ｂ）に示すものとなる。次に、変数RTtmp がnullか比較し、比較結果を変数RTtmp2に格納する。比較結果は偽である。
【０３１９】
『データ受信処理２２』
関数cons(<RTid,RTtmp.retvalue>,recvDat) を評価し、評価結果
cons(<0,("senderA.domainA 100.110.120.130")>,null ）
を変数recvDat に格納する。
【０３２０】
『データ受信処理２３』
データ受信実行部Ｂを終了する。
【０３２１】
この後、トップレベル実行部Ｂの動作のトップレベル実行処理Ｂ８からの処理が実行され、senderA.domainA の/etc/hostsファイルの内容が/etc/hosts-received に保存される。
【産業上の利用可能性】
【０３２２】
本発明によれば、チャネル生成機能と非決定的選択機能を持つタプル空間型ルータを使ってネットワーク上に分散したファイルを交換することができるようになる。
【０３２３】
これにより、本発明によれば、ピアツーピア型の方式を用いてファイル交換を行うときに、誤ったファイル交換が行われないことを実現できるようになる。
【図面の簡単な説明】
【０３２４】
【図１】本発明の処理の流れの説明図である。
【図２】ピアツーピア型通信システムを構成するホストの装置構成図である。
【図３】本発明の適用される通信システムの説明図である。
【図４】タプル空間型ルータの装置構成図である。
【図５】アクティブパート処理部の説明図である。
【図６】パッシブブパート処理部の説明図である。
【図７】本発明者が開示した通信システムの処理の説明図である。
【図８】本発明者が開示した通信システムの処理の説明図である。
【図９】本発明者が開示した通信システムの処理の説明図である。
【図１０】本発明者が開示した通信システムの処理の説明図である。
【図１１】本発明者が開示した通信システムの処理の説明図である。
【図１２】チャネルの生成処理の処理フローである。
【図１３】チャネルの生成処理の処理フローである。
【図１４】プログラム実行部の構成図である。
【図１５】プログラム実行部の利用する評価関数の説明図である。
【図１６】プログラム実行部の利用する評価関数の説明図である。
【図１７】トップレペル実行部の利用する評価関数の説明図である。
【図１８】トップレペル実行部の利用する評価関数の説明図である。
【図１９】本発明によるファイル送信の説明図である。
【図２０】データ送信実行部及びデータ受信実行部が利用する評価関数の説明図である。
【図２１】データ送信実行部の実行する概略の処理フローである。
【図２２】データ送信実行部の実行する詳細な処理フローである。
【図２３】データ送信実行部の実行する詳細な処理フローである。
【図２４】データ受信実行部の実行する概略の処理フローである。
【図２５】データ受信実行部の実行する詳細な処理フローである。
【図２６】データ受信実行部の実行する詳細な処理フローである。
【図２７】変数DONEの値とsearchDONEの評価結果の一例を示す図である。
【図２８】deleteの評価結果の一例を示す図である。
【図２９】変数DONEの値とsearchDONEの評価結果の一例を示す図である。
【図３０】変数DONEの値とsearchDONEの評価結果の一例を示す図である。
【図３１】deleteの評価結果の一例を示す図である。
【図３２】変数DONEの値とsearchDONEの評価結果の一例を示す図である。
【図３３】変数DONEの値とsearchDONEの評価結果の一例を示す図である。
【図３４】通信リクエストの非決定的選択実行の説明図である。
【符号の説明】
【０３２５】
１    プログラム実行部
２    タプル空間型ルータ
３    ネットワーク
１０  データ送信実行部
１１  データ受信実行部
１２  トップレベル実行部
２０  共有メモリ
２１  ネットワークコントローラ
２２  アクティブパート処理部
２３  パッシブパート処理部
【図１】
2006172255.tif 000003
【図２】
2006172255.tif 000004
【図３】
2006172255.tif 000005
【図４】
2006172255.tif 000006
【図５】
2006172255.tif 000007
【図６】
2006172255.tif 000008
【図７】
2006172255.tif 000009
【図８】
2006172255.tif 000010
【図９】
2006172255.tif 000011
【図１０】
2006172255.tif 000012
【図１１】
2006172255.tif 000013
【図１２】
2006172255.tif 000014
【図１３】
2006172255.tif 000015
【図１４】
2006172255.tif 000016
【図１５】
2006172255.tif 000017
【図１６】
2006172255.tif 000018
【図１７】
2006172255.tif 000019
【図１８】
2006172255.tif 000020
【図１９】
2006172255.tif 000021
【図２０】
2006172255.tif 000022
【図２１】
2006172255.tif 000023
【図２２】
2006172255.tif 000024
【図２３】
2006172255.tif 000025
【図２４】
2006172255.tif 000026
【図２５】
2006172255.tif 000027
【図２６】
2006172255.tif 000028
【図２７】
2006172255.tif 000029
【図２８】
2006172255.tif 000030
【図２９】
2006172255.tif 000031
【図３０】
2006172255.tif 000032
【図３１】
2006172255.tif 000033
【図３２】
2006172255.tif 000034
【図３３】
2006172255.tif 000035
【図３４】
2006172255.tif 000036