(57)【要約】  ソフトウェアをアセンブルする方法は、ユーザが、計算関数（ＣＦ）をコード化できるようにする（Ｓ１０１）ことと、ユーザがＣＦをコード化し終えたかどうかを判断する（Ｓ１０２）ことと、ユーザが、利用可能なＣＦの１つまたは複数を使用して部分関数（ＰＦ）をコード化できるようにする（Ｓ１０３）ことと、ユーザが全てのＰＦを作成し終えた時を判断する（Ｓ１０４）ことと、ユーザが、利用可能なＰＦの１つまたは複数を使用してソフトウェアを作成できるようにすることと、含む。【選択図】図１
2018521438.tif 000002
【特許請求の範囲】
【請求項１】
サービスを行うためにコンピュータプログラムをアセンブルする方法であって、
前記サービスの入力／出力（Ｉ／Ｏ）要件を複数のＩ／Ｏキー／値ペアを含む対応するデータメッセージに変換することと、
入力引数として前記データメッセージを受信するように前記プログラムの部分関数（ＰＦ）を構成することと、
計算関数（ＣＦ）の引数に、かつ前記Ｉ／Ｏキー／値ペアにマッピングするキーペアを含む可変マッチング構造（ＶＭＳ）セット（ＶＭＳＳ）を生成することと、
前記ＶＭＳＳを使用して前記計算関数（ＣＦ）を呼び出すように前記ＰＦを構成することであって、前記ＣＦは前記サービスに関連している演算を行うように構成される、構成することと、を含む、方法。
【請求項２】
前記ＶＭＳＳは前記キーペアのサブセットを含むＶＭＳを含み、前記サブセットの前記キーペアの中の第１のキーペアは、前記ＣＦの入力引数にマッピングする第１のキー、および、前記Ｉ／Ｏキー値ペアの中の入力キー／値ペアにマッピングする第２のキーを含む、請求項１に記載の方法。
【請求項３】
前記サブセットの前記キーペアの中の第２のキーペアは、前記ＣＦの出力引数にマッピングする第３のキー、および、前記Ｉ／Ｏキー値ペアの中の出力キー／値ペアにマッピングする第４のキーを含む、請求項２に記載の方法。
【請求項４】
前記データメッセージの名前によって索引付け可能であるデータ記憶域に前記ＶＭＳＳを記憶することをさらに含む、請求項１に記載の方法。
【請求項５】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項１に記載の方法。
【請求項６】
サービスを行うように構成されるコンピュータプログラムを実行する方法であって、前記コンピュータプログラムは、入力引数として複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含むデータメッセージを受信するように構成される部分関数（ＰＦ）を含み、前記方法は、
前記データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造（ＶＭＳ）を含む、検索することと、
検索された前記データ構造におけるそれぞれの要素について、
前記要素の前記名前を使用して計算関数（ＣＦ）を検索し、かつ
前記要素の前記ＶＭＳおよび前記データメッセージを使用して検索された前記ＣＦを呼び出すことと、を含む、方法。
【請求項７】
前記呼び出すことは、前記データメッセージから入力データを判断することと、前記ＶＭＳから前記入力データのデータ部分に前記ＣＦの引数をマッピングすることと、前記マッピングに従って前記データ部分によって前記ＣＦを呼び出すことと、を含む、請求項６に記載の方法。
【請求項８】
前記呼び出すことは、前記検索されたＣＦの以前の呼び出しの結果を含む前記ＰＦの内部データ構造に記憶されるデータをさらに使用する、請求項６に記載の方法。
【請求項９】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項６に記載の方法。
【請求項１０】
前記呼び出すことは、第２のＰＦを起動するために複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含む第２のデータメッセージによって前記検索されたＣＦを呼び出す、請求項６に記載の方法。
【請求項１１】
サービスを行うためにコンピュータプログラムをアセンブルするためのコンピュータプログラム製品であって、プログラム命令が具現化されるコンピュータ可読記憶媒体を備え、前記プログラム命令は、
前記サービスの入力／出力（Ｉ／Ｏ）要件を複数のＩ／Ｏキー／値ペアを含む対応するデータメッセージに変換することと、
入力引数として前記データメッセージを受信するように前記プログラムの部分関数（ＰＦ）を構成することと、
計算関数（ＣＦ）の引数に、かつ前記Ｉ／Ｏキー／値ペアにマッピングするキーペアを含む可変マッチング構造（ＶＭＳ）セット（ＶＭＳＳ）を生成することと、
前記ＶＭＳＳを使用して前記計算関数（ＣＦ）を呼び出すように前記ＰＦを構成することであって、前記ＣＦは前記サービスに関連している演算を行うように構成される、構成することと、を含む方法を行うようにコンピュータによって実行可能である、コンピュータプログラム製品。
【請求項１２】
前記ＶＭＳＳは前記キーペアのサブセットを含むＶＭＳを含み、前記サブセットの前記キーペアの中の第１のキーペアは、前記ＣＦの入力引数にマッピングする第１のキー、および、前記Ｉ／Ｏキー値ペアの中の入力キー／値ペアにマッピングする第２のキーを含む、請求項１１に記載のコンピュータプログラム製品。
【請求項１３】
前記サブセットの前記キーペアの中の第２のキーペアは、前記ＣＦの出力引数にマッピングする第３のキー、および、前記Ｉ／Ｏキー値ペアの中の出力キー／値ペアにマッピングする第４のキーを含む、請求項１２に記載のコンピュータプログラム製品。
【請求項１４】
前記データメッセージの名前によって索引付け可能であるデータ記憶域に前記ＶＭＳＳを記憶することをさらに含む、請求項１１に記載のコンピュータプログラム製品。
【請求項１５】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項１１に記載のコンピュータプログラム製品。
【請求項１６】
サービスを行うように構成されるコンピュータプログラムを実行するコンピュータプログラム製品であって、前記コンピュータプログラムは、入力引数として複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含むデータメッセージを受信するように構成される部分関数（ＰＦ）を含み、前記コンピュータプログラム製品は、プログラム命令が具現化されるコンピュータ可読記憶媒体を備え、前記プログラム命令は、
前記データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造（ＶＭＳ）を含む、検索することと、
検索された前記データ構造におけるそれぞれの要素について、
前記要素の名前を使用して計算関数（ＣＦ）を検索し、かつ
前記要素の前記ＶＭＳおよび前記データメッセージを使用して検索された前記ＣＦを呼び出すことと、を含む方法を行うようにコンピュータによって実行可能である、コンピュータプログラム製品。
【請求項１７】
前記呼び出すことは、前記データメッセージから入力データを判断することと、前記ＶＭＳから前記入力データのデータ部分に前記ＣＦの引数をマッピングすることと、前記マッピングに従って前記データ部分によって前記ＣＦを呼び出すことと、を含む、請求項１６に記載のコンピュータプログラム製品。
【請求項１８】
前記呼び出すことは、前記検索されたＣＦの以前の呼び出しの結果を含む前記ＰＦの内部データ構造に記憶されるデータをさらに使用する、請求項１６に記載のコンピュータプログラム製品。
【請求項１９】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項１６に記載のコンピュータプログラム製品。
【請求項２０】
前記呼び出すことは、第２のＰＦを起動するために複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含む第２のデータメッセージによって前記検索されたＣＦを呼び出す、請求項１６に記載のコンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
本願は、２０１５年７月１６日に出願された米国特許仮出願第６２／１９３，１５１号に対する優先権を主張するものである。
【０００２】
本開示は、一般的に、コンポーネントベースのソフトウェア開発技法に関する。
【背景技術】
【０００３】
手続き型プログラミングは、手続き呼び出しの概念に基づいて構造化プログラミングから導出されるプログラミングパラダイムである。ルーチン、サブルーチン、または関数としても既知である手続きは、実施されるべき一連の計算ステップを包含する。手続き型プログラミング言語の例は、Ｃ、フォートラン、およびパスカルを含む。
【０００４】
オブジェクト指向プログラミングにおいて、インターフェースを使用してビヘイビア（方法）およびデータ（メンバまたは属性）を明らかにするオブジェクトにプログラミングタスクを分類することに焦点を置いている。手続き型プログラミングは、データ構造に対して演算するための手順を使用するが、オブジェクト指向プログラミングは、この２つをひとまとめにするため、クラスのインスタンスである「オブジェクト」はそれ「自体の」データ構造で演算する。
【０００５】
しかしながら、素人にとって、手続き型プログラミングまたはオブジェクト指向プログラミングを使用して、機能させるコンピュータプログラムを書き込むことは、困難である可能性がある。
【０００６】
組み立てラインは、最終組立品が製作されるまで、部品が順に加えられる場合に、半製品の組立品がワークステーション間で移動する際に、交換可能部品が加えられる製造プロセスである。組み立てラインを使用することによって、完成品はより速くかつより少ない労力で組み立て可能である。
【０００７】
よって、ソフトウェアを組み立てラインの様式で構築できるようにする、コンポーネントまたは部分ベースの機構が必要とされている。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明の例示の実施形態によると、サービスを行うためにコンピュータコードをアセンブルする方法が提供される。方法は、サービスの入力／出力（Ｉ／Ｏ）要件を複数のＩ／Ｏキー／値ペアを含む対応するデータメッセージに変換することと、入力引数としてデータメッセージを受信するようにプログラムの部分関数（ＰＦ）を構成することと、計算関数（ＣＦ）の引数に、かつＩ／Ｏキー／値ペアにマッピングするキーペアを含む可変マッチング構造（ＶＭＳ）セット（ＶＭＳＳ）を生成することと、ＶＭＳＳを使用して計算関数（ＣＦ）を呼び出すようにＰＦを構成することであって、ＣＦがサービスに関連している演算を行うように構成される、構成することと、を含む。
【０００９】
本発明の例示の実施形態によると、サービスを行うように構成されるコンピュータプログラムを実行する方法が提供される。コンピュータプログラムは、入力引数として複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含むデータメッセージを受信するように構成される部分関数（ＰＦ）を含む。方法は、データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造（ＶＭＳ）を含む、検索することと、検索されたデータ構造におけるそれぞれの要素について、要素の名前を使用して計算関数（ＣＦ）を検索し、かつ要素のＶＭＳおよびデータメッセージを使用して検索されたＣＦを呼び出すことと、を含む。
【００１０】
本発明の例示の実施形態は、添付の図面と併せて、下記の説明からより詳細に理解可能である。
【図面の簡単な説明】
【００１１】
【図１】本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示す図である。
【図２】方法を実行するために使用可能である例示のコンピュータシステムを示す図である。
【図３】本発明概念の例示の実施形態に従ってソフトウェアの部分関数を構成する方法を示す図である。
【図４】本発明概念の例示の実施形態に従ってソフトウェアの部分関数を実行する方法を示す図である。
【図５】本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示す図である。
【図６】本発明概念の例示の実施形態において（Ａ）は、使用可能である例示のデータメッセージを示す図、（Ｂ）は、使用可能である例示の可変マッチング構造セットを示す図、（Ｃ）は、例示の計算関数の入力引数および出力引数の例を示す図である。
【図７】本発明概念の例示の実施形態に従って、アセンブルされたソフトウェアの部分関数の実行を示すフロー図である。
【図８】本発明概念の例示の実施形態に従って、ユーザがソフトウェアをアセンブルできるようにする方法を示す図である。
【図９】本発明概念の例示の実施形態に従って部分関数を実行する方法を示す図である。
【図１０】本発明概念の例示の実施形態に従って、適用されたデータメッセージに応答して実行される部分関数の例示のシーケンスを示す図である。
【発明を実施するための形態】
【００１２】
本発明概念は、本開示の例示の実施形態が示されている添付の図面を参照して、より詳細に説明される。図面全体を通して、同じまたは同様の参照番号は、同じまたは同様のコンポーネントを表すために使用される。しかしながら、本発明概念は、さまざまなやり方で実装可能であるため、本明細書に開示される実施形態に限定されると理解されるべきではない。むしろ、それらの実施形態は、当業者に本開示の範囲を伝えるために、本開示を徹底的かつ完全に理解するように提供される。
【００１３】
コンポーネントベースのソフトウェアシステムおよび開発方法について本明細書に説明する。下記の説明では、本発明をより徹底的に理解してもらうために、多数の具体的な詳細が示される。しかしながら、本発明が、これらの具体的な詳細なしで実践可能であることは、当業者には明らかとなろう。他の例では、本発明を不明瞭にすることを回避するために、周知の特徴は詳細には説明されていない。
【００１４】
本明細書において言及されるコンピュータコードデバイス（例えば、方法、クラス、ライブラリ）は、データ記憶媒体に記憶されてよい。本明細書において使用されるような「データ記憶媒体」と言う用語は、コンパクトディスク、ハードディスク、フロッピーディスク、テープ、光磁気ディスク、ＰＲＯＭ（ＥＰＲＯＭ、ＥＥＰＲＯＭ、フラッシュＥＰＲＯＭなど）、ＤＲＡＭ、およびＳＲＡＭなどの全てのコンピュータ可読媒体を示す。
【００１５】
図１は、本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示すハイレベル図である。
【００１６】
方法は、ユーザが、計算関数（ＣＦ）をコード化できるようにする（Ｓ１０１）ことを含む。例えば、テキストフィールドを含むＣＦグラフィカルユーザインターフェース（例えば、ＣＦ−ＧＵＩ）は、ユーザがＣＦのコードを入れることができるようにするコンピュータプログラムによって提供可能である。例えば、ＣＦ−ＧＵＩは、ユーザによって選択される時、ユーザが現在のＣＦのコード化を完了したことをプログラムに通知する第１のボタンを含むことができる。例として、ＣＦは、計算を行う、データベースへのクエリを行う、または、ウェブページ上にグラフィックまたはテキストを提示するためにコード化可能である。例えば、クエリによって返された結果に基づいた数学的計算を行うための計算が使用可能である。一実施形態では、それぞれのＣＦは、ユーザによって一意の名前が与えられ、かつ、１つまたは複数の入力パラメータ（本明細書ではＣＦ入力パラメータと呼ばれる）を受信するために、および、出力パラメータ（本明細書ではＣＦ出力パラメータと呼ばれる）を返すためにコード化される。例えば、ＣＦ入力パラメータおよびＣＦ出力パラメータは、整数、浮動小数、文字列、配列、ポインタなどとすることができる。
【００１７】
方法は次いで、ユーザがＣＦをコード化し終えたかどうかを判断する（Ｓ１０２）ことを含む。例えば、第１のボタンの選択は、ユーザが別のＣＦを作成することを所望していることを指示することができる。例えば、ＣＦ−ＧＵＩは、ユーザによって選択される時、ユーザがＣＦ５０を作成し終えたことをプログラムに通知する第２のボタンを含むことができる。完了したＣＦはＣＦデータベース６０に記憶可能であるため、他の符号器に利用可能である。
【００１８】
方法は次に、ユーザが、利用可能なＣＦの１つまたは複数を使用して部分関数（ＰＦ）をコード化できるようにする（Ｓ１０３）ことを含む。例えば、プログラムは、ＧＵＩにおけるＣＦデータベース６０に記憶された利用可能なＣＦの選択可能なリスト、およびＣＦが選択されたこと、およびＰＦ内のそれらの実行順序を示すペインと共に、第２のＧＵＩ（例えば、ＰＦ−ＧＵＩ）を提示することができる。例えば、ユーザは、対応するＣＦのインスタンスが対応するＰＦに必要とされる度に利用可能なＣＦのうちの１つを選択し、かつ、選択されたインスタンスを、ユーザがＣＦインスタンスを実行させることを所望する順序でペインに挿入することができる。
【００１９】
方法は次に、ユーザが全てのＰＦを作成し終えた時をプログラムが判断する（Ｓ１０４）ことを含む。例えば、ＰＦ−ＧＵＩは、ユーザによって選択される時、ユーザが全てのＰＦ７０を作成し終えたことを指示するグラフィカルボタンを含むことができる。ＰＦ７０は、ＰＦデータベース８０に記憶可能であるため、他の符号器に利用可能である。
【００２０】
方法は次いで、プログラムによって、ユーザが、ＰＦデータベース８０に記憶される利用可能なＰＦ７０の１つまたは複数を使用してソフトウェアを作成できるようにする（Ｓ１０５）ことを含む。例えば、コンピュータプログラムを使用して、ユーザが接続コードを入れることができるようにするテキストフィールド、および利用可能なＰＦ７０の選択可能なリストを提示する第３のＧＵＩをローンチするために使用可能である。例えば、ユーザは、対応するＰＦを、コンピュータプログラムの接続コードにおけるある特定の場所に挿入するためにＰＦをリストから選択可能である。一実施形態では、コンピュータプログラムは、インタープリタによって解釈されるフォームであってよい。
【００２１】
図２は、図１の方法を実装するために使用可能である例示のコンピュータシステム１０００を示す。図２を参照すると、コンピュータシステム１０００は、例えば、中央処理装置（ＣＰＵ）１００１、ランダムアクセスメモリ（ＲＡＭ）１００４、プリンタインターフェース１０１０、ディスプレイユニット１０１１、ローカルエリアネットワーク（ＬＡＮ）データ伝送コントローラ１００５、ＬＡＮインターフェース１００６、ネットワークコントローラ１００３、内部バス１００２、および例えば、キーボード、マウスといった１つまたは複数の入力デバイス１００９などを含むことができる。示されるように、システム１０００は、リンク１００７を介してデータ記憶デバイス、例えばハードディスク１００８に接続されてよい。上述されたＧＵＩはディスプレイユニット１０１１上に提示可能である。上述されたＣＦ５０、ＰＦ７０、プログラム、およびアセンブルされたソフトウェアは、メモリ１００４および／またはハードディスク１００８に記憶されてよい。
【００２２】
図３は、ＰＦをコード化するために図１のステップＳ１０３を実装するために使用可能である本発明の例示の実施形態による方法を示す。図３を参照すると、方法は、計算目標データメッセージ（ＣＧＤＭ）の入力を受信するように部分関数を構成する（Ｓ３０１）ことを含む。
【００２３】
例示の実施形態では、ＣＧＤＭは、ｉ）入力部分および出力部分、ｉｉ）名前／値フォーム（例えば、全ての値、いずれの後の計算においても変数に割り当てられる値のサブ構造は名前を有するものとする）を有し、ｉｉｉ）その構造はいくつかの横文規則（例えば、ＨＴＭＬ、ＸＭＬ、またはＪＳＯＮ）に従う。２つのＣＧＤＭは、ｉ）これらの入力部分および出力部分の両方が同じ構造を有し、かつｉｉ）該構造における全ての名前が同じである場合、同じである。ＣＧＤＭはＰＦの引数として使用される。いずれのＰＦも１つの引数しか有することができない。ＰＦは１つまたは２つ以上のＣＧＤＭを処理できる。それぞれのＣＧＤＭは対応するＶＭＳＳを有する。ＶＭＳＳは、ＣＧＤＭの計算目標をどのように達成するかをＰＦに命令する。
【００２４】
全てのＰＦは同じインターフェースを有する。例えば、それぞれの部分関数は、部分関数の起動パラメータまたは引数と呼ばれる場合があるＣＧＤＭで起動されるように構成される。ＣＧＤＭは、入力パラメータＸ（例えば、入力：Ｘ）、および出力パラメータＹ（例えば、出力：Ｙ）を含み、この場合、ＸおよびＹは名前（キー）／値フォームを有する任意のデータ構造とすることができる。Ｘ部分において、名前は値を有し、Ｙ部分の値は、部分関数によって埋められるように空白である。２つのＣＧＤＭは、これらの入力部分および出力部分の両方が同じ構造を有し、かつ該構造における全ての名前（キー）が同じである場合、同じである。それぞれのＣＧＤＭは一意の名前を有する。この入力部分セットの全ての名前（キー）の値を有するＣＧＤＭは、ＣＧＤＭのインスタンスと呼ばれる。ＰＦは、埋められた値を有するＣＧＤＭの出力部分と同じデータ構造を返す。ＰＦは引数としてのいずれのＣＧＤＭも受け入れる。
【００２５】
ＰＦは１つまたは複数の計算関数（ＣＦ）を包含する。いずれの関数もＣＦとすることができる。ＰＦは、ＰＦがＣＦをどのように実行するかがＣＧＤＭだけでなく、可変マッチング構造（ＶＭＳ）と呼ばれるデータ構造によっても判断されるため、いずれのＣＧＤＭも引数として受け入れ可能である。ＰＦはＣＦ呼び出し元を通してＣＦを実行する。ＣＦ呼び出し元は、引数として、ＣＧＤＭ、ＶＭＳ、およびＣＦＲｅｓｕｌｔｓを受け入れる。呼び出すためにＰＦには一定のインターフェースが与えられる。ＣＦ呼び出し元は、ｉ）ＣＧＤＭおよびＶＭＳに従ってＣＦおよび呼び出しの引数を準備し、ｉｉ）ＣＧＤＭおよびＶＭＳに従ってＣＧＤＭの出力部分を設定し、ｉｉｉ）後のＣＦの実行による使用を可能にするためにＣＦＲｅｓｕｌｔｓに結果を保存する。
【００２６】
本発明の一実施形態では、ｉ）完全ＣＦおよびｉｉ）部分ＣＦの、２つの型のＣＦ関数が存在してよい。完全ＣＦはＰＦを呼び出さず、インターフェース要件を完了させている。部分ＣＦはＰＦを呼び出し、インターフェース要件を部分的に終わらせている。インターフェース要件がどのように行われるかは、どのＰＦが呼び出されるか、およびＰＦが何を行うように構成されるかに左右される。
【００２７】
ＣＦがＰＦを呼び出す時、ＣＧＤＭを準備し、かつ、引数としてのＣＧＤＭを呼び出したＰＦに渡す。ＣＧＤＭにおける値の命名は、無矛盾の命名規則に従う場合がある。ＣＦが呼び出すＰＦの名前、およびＣＦが作成するＣＧＤＭの名前は、ＣＦのＶＭＳにおいて指定可能である。
【００２８】
ＶＭＳＳはＣＦを接続する制御を行い、部分ＣＦはＰＦを接続する制御を行う。ソフトウェアは所与の設計に従って、ＰＦおよびＣＦを接続するためにＶＭＳおよびＶＭＳＳを操作することによって形成可能である。
【００２９】
１つのＣＧＤＭについて、ＣＧＤＭの計算構造のＣＧＤＭの計算目標を達成するために（２つ以上のＰＦを伴う場合がある）全てのＰＦおよびＣＦの実行シーケンスを呼び出す。
【００３０】
図６Ａは、部分関数に引数として渡される可能性があるＣＧＤＭの一例である。この例では、ＣＧＤＭはＪａｖａＳｃｒｉｐｔ（登録商標である）Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する。ＣＧＤＭは、１つまたは複数の入力キー／値ペアおよび出力キー／値ペアを含む。ＣＧＤＭは、入力キー／値ペアおよび出力キー／値ペアを抽出するためにパーサーまたはインタープリタによって使用可能である識別子を含むことができる。
【００３１】
図６Ａに示される例において、ＣＧＤＭにおける入力パラメータ識別子は「入力」という名称が付けられ、出力パラメータ識別子は「出力」という名称が付けられる。例えば、ＣＧＤＭをパースするパーサーが「入力」の識別子を認識後、パーサーは、次の左中括弧「｛｝と右中括弧「」」との間に位置する次の要素がキー／値入力パラメータペアであると仮定することができる。例えば、ＣＧＤＭをパースするパーサーが「出力」の識
別子を認識後、パーサーは、次の左中括弧「｛」と右中括弧「｝」との間に位置する次の要素がキー／値出力パラメータペアであると仮定することができる。例えば、キー／値ペアは、セミコロン「；」によって分離可能であり、所与のキー／値ペアのキーおよび値はコロン「：」によって分離可能である。
【００３２】
図６Ａは、入力パラメータキー／値ペアを示すための「入力」という用語の使用、出力パラメータキー／値ペアを示すための「出力」という用語の使用、キー／値ペアの開始を示すための「｛」という用語の使用、キー／値ペアの終わりを示すための「｝」という用語の使用、および、パーサーがキーと値とを区別できるようにするための「：」という用語の使用を示すが、本発明はこれらに限定されない。例えば、これらの用語は、実行者によって所望されるように、他の語または記号に変更されてよい。
【００３３】
図３に戻って参照すると、方法は、ユーザが計算関数（ＣＦ）の新しいインスタンスを呼び出すために部分関数を所望しているかどうかを判断する（Ｓ３０２）ことを含む。新しいインスタンスは、これが、挿入するための特定的なＣＦがリクエストされた１回目である、または、リクエストされた挿入がＣＦ（例えばＣＦ２）のインスタンスを異なるＣＦ（例えばＣＦ１）の後に挿入させることになることを意味する。説明を簡単にするために、図６Ｂに示されるような、第１の計算関数ＣＦ１および第２の計算関数ＣＦ２のみが利用可能であると仮定する。ユーザがＣＦの新しいインスタンスをリクエストしている場合、方法は、特定のＣＦを特定するためにラベルを挿入する（Ｓ３０３）。例えば、ユーザは、第１の計算関数ＣＦ１が使用されることをリクエストしているため、方法は、「ＣＦ１」などのラベルを可変マッチング構造シーケンス（ＶＭＳＳ）に挿入して、第１の計算関数ＣＦ１が呼び出されるように特定する。ＶＭＳＳは、完了すると、ペアのシーケンスを含むことになり、この場合、それぞれのペアは所与のＣＦ（例えば、ＣＦ１）およびＶＭＳ（例えば、ＣＦＮａｍｅ、ＶＭＳ）の名前を含む。例えば、完了したＶＭＳＳは、｛｛ＣＦ１、ＶＭＳ１｝、…、｛ＣＦＮ、ＶＭＳＮ｝｝のペアを含むことができ、この場合Ｎは１またはそれ以上である。ＶＭＳＳはＣＧＤＭに関連付けられ、ＶＭＳＳにおける全てのＶＭＳはＣＧＤＭの全ての名前の（キーの）値を埋める。すなわち、ＶＭＳＳはＣＧＤＭの計算目標を満たす。ＶＭＳＳは、ＰＦに、ＣＧＤＮの計算目標をどのように達成するかを命令する。
【００３４】
次に、方法は、ＣＦインスタンスの入力パラメータをＣＧＤＭ内の入力パラメータにマッピングし、かつ、ＣＦインスタンスの出力パラメータをＣＧＤＭ内の出力パラメータを出力するためにマッピングする可変マッチング構造（ＶＭＳ）をユーザが構成できるようにする（Ｓ３０４）ことを含む。ＶＭＳは、ＰＦに、１つのＣＦをどのように実行するかを命令する。
【００３５】
例えば、図６Ｂは、それぞれのキーペアがセミコロン「；」で分離される複数のキーペアを有する第１のＣＦ１  ６１１のために構成される第１のＶＭＳ６０１の例を示す。例えば、第１のＶＭＳ６０１の第１のキーペア「ａ：ｘ」における第１のキー「ａ」は、第１のＣＦ１  ６１１の第１の入力パラメータ「ａ」に対応し、第１のキーペア「ａ：ｘ」における第２のキー「ｘ」は図６Ａに示されるＣＧＤＭ６００の第２の入力パラメータ「ｘ：２」に対応する。例えば、第１のＶＭＳ６０１の第２のキーペア「ｂ：ｙ」における第１のキー「ｂ」は第１のＣＦ１  ６１１の第２の入力パラメータ「ｂ」に対応し、第２のキーペア「ｂ：ｙ」における第２のキー「ｙ」は図６Ａに示されるＣＧＤＭ６００の第３の入力パラメータ「ｙ：３」に対応する。例えば、第１のＶＭＳ６０１の第３のキーペア「ｃ：ｚ」における第１のキー「ｃ」は第１のＣＦ１  ６１１の出力パラメータ「ｃ」に対応し、第３のキーペア「ｃ：ｚ」における第２のキー「ｚ」は図６Ａに示されるＣＧＤＭ６００の出力パラメータ「ｚ：ＮＵＬＬ」に対応する。図６Ｃは、ＣＦに対する呼び出しの例を示す。ＣＦの引数が複合型である場合、ＣＧＤＭの入力部分における同じ複合型にマッピングする場合、引数の名前がＣであり、かつ同じ型（ＣＧＤＭの入力部分のサブ構造）の名前がＤであると仮定する場合に、マッピングは「Ｃ：Ｄ」と指定可能である。ＣＧＤＭの入力部分における同じ複合型にマッピングせず、そのメンバがＣＧＤＭの入力部分において分布した名前にマッピングする場合、複合型のそれぞれのメンバのマッピングは指定される必要がある。複合型がＴであり、かつＣＧＤＭの入力部分における名前がｄ１、ｄ２、…であると仮定する場合、マッピングは「Ｃ、Ｔ（「ｍｅｍｂｅｒ１：ｄ１」、「ｍｅｍｂｅｒ２：ｄ２」…）」と指定可能である。Ｃが配列型である場合、マッピングは「Ｃ：Ａｒｒａｙ［ｄ１、ｄ２、…］」と指定可能である。
【００３６】
次に、方法は、構成されたＶＭＳを、部分関数ＣＦに関連付けられたＶＭＭＳに挿入する（Ｓ３０５）。ＶＭＳは、特定されたＣＦに関連付けられていることをパーサーが認識できるように挿入される。例えば、ラべル「ＣＦ１」より下の図６Ｂに示される第１のＶＭＳ６０１は、ＰＦがＶＭＳＳに挿入されておりかつ第１の計算関数ＣＦ１に関連付けられているように構成されるＶＭＳの一例である。方法は次いで、ユーザがし終えたかどうかを判断する（Ｓ３０５）ことを含む。例えば、ＧＵＩは、計算関数（ＣＦ）を選択し、かつ、計算関数（ＣＦ）に入れ終わっていることを指示するために、ユーザによって使用可能である。ユーザが別の計算関数（ＣＦ）、または、先に選択された計算関数（ＣＦ）の別のインスタンスを選択する場合、方法はステップＳ３０２に進む。例えば、ユーザが同じＣＦ（例えば、再びＣＦ１）の別のインスタンスに入れかつＣＧＤＭの異なるパラメータをＣＦに送るとしたら、方法はステップＳ３０４に進むことになる。例えば、これによって、第１の計算関数ＣＦ１を特定する同じラベル（例えばＣＦ１）下の第２のＶＭＳ６０２が挿入されることになる可能性がある。しかしながら、ユーザが新しい計算関数（例えば、ＣＦ２  ６１２）を選択する場合、図６Ｂに示されるように、第２のラベル（例えばＣＦ２）および第３のＶＭＳ６０３が挿入されることになる可能性がある。
【００３７】
ＣＧＤＭの入力から値を取ること以外に、ＣＦの引数は、また、１つまたは複数の先に実行されたＣＦの結果から値を取ることができる。例えば、ＰＦが第１のＣＦを実行する時、ＣＦの実行の結果をＰＦの内部にあるデータ構造（例えば、ＣＦＲｅｓｕｌｔｓ構造）またはリストに記憶でき、それによって、ＰＦが同じ第１のＣＦまたは第２のＣＦを再実行する場合、その結果は、対応するＣＦが必要に応じて該結果に基づいて演算できるように、どちらのＣＦにも利用可能である。図７に示されるように、ＰＦ７０１がＰＦ呼び出しを通して呼び出される時、ＰＦ７０１はＣＦＣａｌｌｅｒ関数を通してＣＦを実行する。ＣＦＣａｌｌｅｒ関数は、複数の利用可能なＣＦＣａｌｌｅｒ関数を記憶する外部記憶領域７０２（例えば、ＣＦＣａｌｌｅｒストア）からロードされてよい。ＣＦＣａｌｌｅｒ関数は、入力として、ＣＧＤＭ、ＣＦに関連付けられたＶＭＳＳ７０３、およびＣＦＲｅｓｕｌｔｓ構造７０４を取る。ＶＭＳＳ７０３は、外部記憶領域７０５（例えば、ＶＭＳＳストア）からロードされてよい。ＣＦＣａｌｌｅｒ関数は、下記を行う。１）ＣＦの引数を宣言し、かつＶＭＳＳ７０３、ＣＧＤＭ、およびＣＦＲｅｓｕｌｔｓ構造７０４内のＣＦＲｅｓｕｌｔｓを使用してそれぞれの引数を初期化し、２）引数によってＣＦを実行し、３）その結果をＣＦＲｅｓｕｌｔｓ構造７０４に加えて、ＶＭＳＳ７０３に従ってＣＧＤＭの出力（例えば、ＣＧＤＭ．ｏｕｔｐｕｔ）を設定する。一実施形態では、それぞれのＣＦは、関連のＣＦＣａｌｌｅｒ関数を有し、それぞれのＣＦは同じインターフェースを有する。ＶＭＳＳストアは、ＰＦが呼び出される全てのＣＧＤＭに対する全てのＶＭＳＳを包含する。ＣＦＣａｌｌストアは、ＰＦが包含する全てのＣＦに関連付けられたＣＦＣａｌｌｅｒ関数を包含する。
【００３８】
図４は、本発明の例示の実施形態に従って、受信されたＣＧＤＭのＰＦ呼び出しを実行するための方法を示す。方法は、ＣＧＲｅｓｕｌｔｓ構造７０４をクリアする（Ｓ４０１）ことと、ＣＧＤＭの名前を使用してＶＭＳＳストア７０５から対応するＶＭＳＳ７０３を検索する（Ｓ４０２）ことと、ＶＭＳＳ７０３におけるそれぞれの要素について、要素の名前部分を使用してＣＦＣａｌｌｅｒストア７０２からＣＦＣａｌｌｅｒ関数を検索し、かつ要素のＶＭＳ部分、ＣＧＤＭ、およびＣＦＲｅｓｕｌｔｓ構造７０４によって、検索されたＣＦＣａｌｌｅｒ関数を呼び出す（Ｓ４０３）ことと、（この時値が埋められている）ＣＧＤＭの出力をコピーする（Ｓ４０４）ことと、そのコピーを返す（Ｓ４０５）ことと、を含む。
【００３９】
ＣＦは他のＰＦを呼び出すことができる。これを行うやり方は、ＣＧＤＭを作成し、かつ、引数として作成されたＣＧＤＭをこの呼び出しに渡すことである。ＣＦが、計算するＣＧＤＭにおける値を、作成するＣＧＤＭに渡す場合、ＣＦは、計算するＣＧＤＭにあるのと同じ名前を使用するものとする。ＣＦが、ＣＦＲｅｓｕｌｔｓ構造７０４における値を、作成するＣＧＤＭに渡す場合、ＣＦＲｅｓｕｌｔｓ構造７０４にあるのと同じ名前を使用するものとする。これは無矛盾の名前規則と呼ばれる。ＣＦが別のＰＦを呼び出すためのＣＧＤＭを作成する時、無矛盾の名前規則に従うものとする。
【００４０】
全てのＰＦが同じインターフェースを有するため、種々のＰＦを呼び出す際の違いは名前によるだけである。ＰＦ名前引数は、呼び出すＰＦ全てに対するＣＦに加えられることが可能であり、その後、呼び出すＰＦはＣＦのＶＭＳにおいて指定可能である。また、作成するＣＧＤＭの名前は、ＶＭＳにおいて指定可能である。そのため、ＣＦが呼び出すのはどのＰＦか、および使用するＣＧＤＭの名前が何かについては、ＣＦの開発後に判断可能である。
【００４１】
一実施形態において、データ記憶パラメータの全ては、名前（キー）／値フォームである。データ記憶フォーマットは、ＣＧＤＭと共に種々の横文規則を有することができる。
【００４２】
データ記憶域およびＣＧＤＭにおける名前は、種々のユーザよっておよび種々の時に作成可能であるため、矛盾する場合がある。名前／値のセットは、セットにおける同じ名前が命名された値に対して同じ意味論的意味を記述し、かつ、セットにおける異なる名前が命名された値に対する異なる意味論的意味を記述する場合、無矛盾と言われる。無矛盾の名前／値のセットは、名前空間（ＮＳ）を形成する。ＰＦおよびこのＣＦは１つのＮＳにおいて演算する必要がある。ＣＧＤＭおよびデータ記憶域が１つのＮＳにおけるものでない場合、それらを１つのＮＳに変換するための変換が、ＣＧＤＭに適用可能である。１つのＣＧＤＭについて、ＣＧＤＭの計算目標を達成するために全てのＰＦおよびＣＦの実行シーケンスが呼び出される。
【００４３】
図５は、本発明の例示の実施形態によるソフトウェア開発プロセスを示す。プロセスは、ソフトウェアの全ての入力要件および出力要件をＣＧＤＭフォーマットに変換する（Ｓ５０１）ことと、その変換から生成されたそれぞれのＣＧＤＭの計算構造を設計し、マークアップ規則によってＣＧＤＭをマーキングし、必要に応じて新しいマークアップ規則を作成し、必要に応じて、プロパティシートを使用して新しいマークアップ規則によってＣＧＤＭをマーキングする（Ｓ５０２）ことと、設計された計算構造をサポートするようにデータ記憶域を設計する（Ｓ５０３）ことと、既存のＰＦおよび／またはＣＦを選択し、新しいマークアップ規則が加えられる場合、必要に応じて新しいＰＦおよび／またはＣＦを開発し、関わるＣＦに対して新しいＣＦＣａｌｌｅｒを開発する（Ｓ５０４）ことと、開発されたおよび／または選択されたＰＦならびにＣＦを接続するためにＶＭＳおよびＶＭＳＳを作成する（Ｓ５０５）こととを含む。
【００４４】
一実施形態では、ステップＳ５０５は、入力部分の値、すなわち、ＣＧＤＭの名前インスタンス（ＮＩ）なしでＣＧＤＭを呼び出すことによって実施される。ＮＩは、値のない入力部分および出力部分によるＣＧＤＭである。一実施形態では、他のＰＦを呼び出すそれぞれのＣＦは開発モード（ＤＶ）処理を有する。ＤＶにおいて、ＣＧは、計算するＣＧＤＭのＮＩを取り、かつ、計算するＣＧＤＭに対して作成する全てのＣＧＤＭのＮＩを、（例えば、ファイルのような）持続的データ記憶域に出力する。出力されたＮＩは呼び出されたＰＦのＣＧＤＭのコンテンツを指定する。ＶＭＳおよびＶＭＳＳはそれに応じて作成可能である。
【００４５】
図８は、本発明概念の例示の実施形態に従って、利用可能な部分関数（ＰＦ）の１つまたは複数を使用してソフトウェアを生成する方法を示す。方法は、利用可能なＰＦからＰＦを選択するためにユーザにクエリを行う（Ｓ８０１）ことと、入力名前（キー）／値ペアおよび出力キー／値ペアを入れるためにユーザにクエリを行う（Ｓ８０２）ことと、入れられたデータに基づいてＣＧＤＭをフォーマットする（Ｓ８０３）ことと、入力引数としてフォーマットされたＣＧＤＭによってＰＦ呼び出しを挿入する（Ｓ８０４）ことと、ユーザがＰＦ呼び出しをし終えたかどうかを判断する（Ｓ８０５）こととを含む。ユーザがし終えてない場合、方法は、新しいＰＦを選択するためにユーザにクエリを行うようにステップＳ８０１に進む。ユーザがし終えている場合、方法は終了する。
【００４６】
図９は、本発明の例示の実施形態に従って、ＰＦ呼び出しを含むソフトウェアを解釈する方法を示す。方法は引数としてＰＦ呼び出しに渡された所与のＰＦおよびＣＧＤＭを特定するためにＰＦ呼び出しをパースする（Ｓ９０１）ことを含む。方法は次いで、特定されたＰＦに関連付けられたＶＭＳＳをロードし、かつ、特定されたＣＧＤＭ内の入力キー／値ペアおよび出力キー／値ペアを特定する（Ｓ９０２）ことを含む。方法は、次いで、ロードされたＶＭＳＳの次の行をパースする（Ｓ９０３）ことを含む。方法は次いで、パースされた行がＣＦラベルを含むかどうかを判断する（Ｓ９０４）。例えば、次の行が図６Ｂに示されるＶＭＳＳの第１の行である場合、方法は、ＣＦ１のＣＦラベルを特定したと結論付けることになる。ＣＦラベルが特定されたと判断される場合、方法は、判断されたＣＦラベルから呼び出すための特定のＣＦを特定し、かつ、ＶＭＳＳの次の行をパースする。その後、方法が、次の行がＣＦラベルでない（すなわち、次の行がＶＭＳに対応する）と判断する場合、方法は、ＶＭＳの現在のキーペアの第１のキーを特定されたＣＦの選択されたＩ／Ｏパラメータにマッチさせ、かつ、現在のキーペアの第２のキーを特定されたＣＧＤＭの選択されたＩ／Ｏキーにマッチさせる（Ｓ９０６）。例えば、ＶＭＳ６０１がパースされ、かつ、パースされた現在のキーペアが「ａ：ｘ」であり、特定されたＣＦがＣＦ１  ６１１である場合、方法は、現在のキーペア「ａ：ｘ」の第１のキー「ａ」をＣＦ１  ６１１の入力パラメータにマッチさせ、かつ、現在のキーペアの第２のキー「ｘ」をＣＧＤＭ６００の入力パラメータｘ：２の入力キー「ｘ」にマッチさせる。次いで、方法は、ＣＦの選択されたＩ／Ｏパラメータが選択されたＩ／Ｏキーの値を渡されるように、特定されたＣＦへの呼び出しをフォーマットする（Ｓ９０７）ことを含む。例えば、ＣＦＬ１  ６１１の入力パラメータ「ａ」は値「２」が渡されるが、これは、第１のキー「ａ」が「ｘ」にマッチさせられ、ｘは２に設定される（例えば、「ｘ：２」）からである。方法は次いで、ＶＭＳのあらゆるキーペアに対するこれらのマッチングステップを繰り返す。方法は、し終えたかどうかを判断するために、ＶＭＳの最後のキーペアがパースされたかどうかを判断する（Ｓ９０８）。方法が終えられていない場合、ステップＳ９０６に進むことによって、ＶＭＳの次のキーペアに進行する。方法が終えられている場合、ステップＳ９０２に進んで、ＶＭＳＳの次の行をパースして、先に特定されたＣＦラベル下で新しいＣＦラベルまたは別のＶＭＳのどちらかを見つける。
【００４７】
図６ＡはＣＧＤＭのＪＳＯＮフォーマットの使用を示すが、本発明はこれに限定されない。例えば、ＪＳＯＮフォーマットは、ハイパーテキストマークアップ言語（ＨＴＭＬ）フォーマットまたは拡張マークアップ言語（ＸＭＬ）フォーマットと置き換え可能である。マークアップ規則は、アルゴリズムの任意の入力インスタンスについて、それに対応する拡張コンテンツがあるように、かつ、入力インスタンスおよびこの全データ特徴が拡張コンテンツから演繹できるように、ＣＧＤＭの横文規則を使用してＣＧＤＭのコンテンツを拡張する規則として定義される。マークアップ規則はアルゴリズムに関連付けられる。
【００４８】
本発明の一実施形態では、ソフトウェアへの入力データメッセージはＨＴＭＬフォーマットであり、ＣＧＤＭはＪＳＯＮフォーマットであり、データ記憶域はリレーショナルデータベースであり、これによってウェブ開発環境が可能になる。入力をハンドリングする部分関数はウェブブラウザにおいて作動し、フロントエンド部分関数と呼ばれる場合がある。サーバ側を作動させる部分関数はバックエンド部分関数と呼ばれる場合がある。バックエンド部分関数はデータベースに接続可能である。
【００４９】
ＨＴＭＬ入力を処理する１つのＰＦは、線形カスケード入力をハンドリングするものとすることができる。線形カスケード入力の例には、州を選択後、国を選択し、次いで市を選択する入力がある。この入力は、＜ｓｅｌｅｃｔ＞のリストおよび現在の選択であり、出力は次のオプション型配列である。マークアップ規則は、リストを表現する任意の規則とすることができる。マークアップ規則の例には、第１のリストを＜ｓｅｌｅｃｔ  Ｃａｓｃａｄｅ＝“ｃｓ１”ｃｓ１＝”１”ｍＮａｍｅ＝”ｎａｍｅ１”…＞とマーキングする、第２のリストを＜ｓｅｌｅｃｔ  Ｃａｓｃａｄｅ＝”ｃｓ１”ｃｓ１＝”２”ｍＮａｍｅ ＝”ｎａｍｅ２”…＞とマーキングする、第３のリストを＜ｓｅｌｅｃｔ  Ｃａｓｃａｄｅ＝”ｃｓ１”ｃｓ１＝”３”ｍＮａｍｅ ＝”ｎａｍｅ３”…＞とマーキングする、などがある。カスケードは計算名であり、Ｃａｓｃａｄｅ＝”ｃｓ１”はｃｓ１＝’ｎ’であるインスタンスｃｓ１を宣言し、その後、リストにおける位置を宣言する。ＰＦは＜ｓｅｌｅｃｔ＞要素のｏｎＳｅｌｅｃｔイベントによってトリガされる。同じｏｎＳｅｌｅｃｔイベントハンドラのｃａｓｃａｄｅＨｎｄｌｅｒは全ての＜ｓｅｌｅｃｔ＞に対して設定される。ｃａｓｃａｄｅＨｎｄｌｅｒはこの型の入力要件および出力要件をハンドリングする部分関数である。ハンドラのアルゴリズムは以下になる。
Get instance name from Cascade=”instance_i”;
Get position number from instance_i=”n”;
Get selected value v and name n1 of the current <select>
Get name n2 of the next <select>
Send a data message of the form 
{{ “input”: 
{“n1” : v} 
},
{ “output”: {
[{“n2”:0}]}
}}
to a backend component
Set return result to the next <select>
【００５０】
１つのＨＴＭＬデータメッセージにおける任意の長さの任意の数のカスケード入力は、この部分関数によってハンドリングされることが可能である。
【００５１】
入力の別のケースは、スターカスケード入力と呼ばれ、この場合、いくつかの＜ｓｅｌｅｃｔ＞のオプションは、利用可能なサイズおよび色のオプションが、どのクロスが選定されたかに基づいて決定される場合のように、１つの＜ｓｅｌｅｃｔ＞によって決定される。中央マークについて、＜ｓｅｌｅｃｔ  ｓｔａｒ＝”ｓｔａｒ１”ｓｔａｒ１＝”ｎａｍｅ  ｌｉｓｔ  ｏｆ  ａｌｌ  ｅｎｄ  ｓｅｌｅｃｔ  ｎｏｄｅ”＞である。エンドノード＜ｓｅｌｅｃｔ＞がマーキングされる必要はない。中央の＜ｓｅｌｅｃｔ＞の選択がし終わると、以下のフォームのデータメッセージがバックエンドに送られる。
{
{“input”: 
{“centerName” : “v”} 
},
{ “output”: {
[{“n1”, “”}],
[{“n2”, “”}],
…
}}
}
この場合、ｎ１およびｎ２はエンドノードの名前である。返された値が配列ではなく単一値であり、かつエンドノードがテキストまたは数入力である時、これは、カスタマの名前が選定されるようにオートフィルとなり、このアドレスはオートフィルされる。
【００５２】
入力候補ハンドリングは、オートフィルの逆算である。部署および位置の入力が被雇用者の名前入力候補の入力を制限するように、現在の入力値およびいくつかの他の入力値以外は現在の入力のオプションを制限することができる。現在の入力値がテキストである時、提案された値に関して、２つ以上の解釈がある場合があり、例えば、提案された値がこのテキストで開始するまたはテキストを包含すること意味する場合がある。そのため、さらなる情報が以下のような値に対して提供される必要がある。
{
{“input”: {
{“otherValues1”: “v1”},
{“otherValues2”: “v2”},
{“currentValue”:  {
{“value”: “v3”},
{“type”: “LIKE”}
}
}
… 
},
{ “output”: {
[{“n1”, “”}]
}
}
}
ここで、ｎ１は現在の入力要素の名前である。
【００５３】
第１の要素＜ｉｎｐｕｔ  ｒａｎｇｅＩｎｐｕｔ＝”ｒｉ１”ｒｉ１＝”１”…＞、第２の要素＜ｉｎｐｕｔ  ｒａｎｇｅＩｎｐｕｔ＝“ｒｉ１”ｒｉ１＝”２”…＞、または、選択入力について、第１の要素＜ｓｅｌｅｃｔ  ｒａｎｇｅＩｎｐｕｔ＝”ｒｉ１”ｒｉ１＝”１”…＞、第２の要素＜ｓｅｌｅｃｔ  ｒａｎｇｅＩｎｐｕｔ＝”ｒｉ１”ｒｉ１＝”２”…＞といったマックアップ規則を有する範囲入力がまた、実装可能である。アルゴリズムは、他の入力によって制約集合を満足させるかどうか、または１つの入力が他の入力のオプションを制限するかどうかの、現在の入力チェックを受け入れる前のものである。入力フォーマット選定に起因して、日にち範囲入力、選択範囲入力、数値範囲入力のような数個の異なる型の範囲入力が存在する場合がある。
【００５４】
フォームは、ある数の異なる型の入力要素（テキスト、数値、リストオプション、範囲入力、カスケード入力…）を包含する。フォーム送信のアクションは、全ての要素に対する（名前、値）ペアを収集することである。フォーム送信のマークアップ規則は、入力要素のそれぞれの型に対して型記号を定義している。異なる型は、名前値へのアクセスが種々のやり方を使用する必要があることを意味する。それぞれの入力要素をその適正な型に対してマーキングする。フォーム送信に対するアルゴリズムは以下になる。
For each type {
Get all input element for the type
For each input element of the type {
Get the name and value, pack the name value into JSON format.
}      
}
mark the data message as ADD or MODIFY
send the JSON data message to a backend address
【００５５】
フォーム送信は、新しいデータのＡＤＤまたは古いデータのＭＯＤＩＦＹのどちらかとすることができる。修正について、データは最初に、いくつかの余分なデータ、キー、または参照番号と共に、バックエンドからロードされる。次いで、データは修正され、バックエンドに送られる。余分なキーデータはクッキーなどの同様の機構によってハンドリング可能である。クッキーの１つの実装形態は、特殊なタグを有するＨＴＭＬのいくつかの隠された要素を使用することである。新しいデータを加えるために、この余分なキーデータは使用されない。そのため、フォーム送信に対するＰＦは、修正と追加とを区別することができる。ＰＦのフォームは、定義された型の任意の数の入力要素と共に任意のフォームのフォーム送信をハンドリング可能である。
【００５６】
サーチページは、サーチ条件としての１つまたは複数のデータ入力要素、および、サーチ結果を表示するための２次元データグリッドを包含する。データグリッドのそれぞれの列は命名可能である。データサーチの送信について、バックエンドに送られるＪＳＯＮデータメッセージは、２つの部分、つまり、以下に示されるような空の２次元配列部分のサーチ条件部分およびデータグリッド部分を有する。
{
{“input”:{
{“name1”: “value1”},
{“name2”: {
{“Max”: {“value”: “v2”, “EQUAL”: “true”}}, 
{“Min”: {“value”: “v3”, “EQUAL”: “false”}}
} },
…      
},
{“output”: {
[[{name4:0}, {name5:0},…]]
}}
}
ここで、ｎａｍｅ２は範囲値入力を指定し、ＥＱＵＡＬは、ｔｒｕｅが＜＝ｐｒ＞＝を意味し、ｆａｌｓｅが＜ｏｒ＞を意味する。
【００５７】
サーチ条件部分は、命名されかつマーキングされた型とすることができ、ＡＤＤのフォームと同じようにパッケージングされる。
【００５８】
バックエンドの１つの実施形態は、データ記憶域としてリレーショナルデータベースを選定することであり、データメッセージの間で送受信されるデータメッセージはＪＳＯＮフォーマットである。リレーショナルデータベースと相互作用する必要があるＰＦについて、データベーススキーマ名が使用される必要がある。データベーススキーマ名に対応するデータメッセージにおける名前を機能させるために、これらの名前はデータベーススキーマ名に変換される。テーブルの列名はｔａｂｌｅＮａｍｅ．ｃｏｌｕｍｎＮａｍｅのフォームである。単一のテーブルにおける挿入をハンドリングするＰＦは、以下のようにＣＧＤＭによって実装可能である。
{“input”: {
{“column1”: “table1.column1”},
{“column2”: “table1.Column2” },
{“column3”, “table1.Column3” },
…
} }
【００５９】
１つのテーブルに挿入するために、それぞれの列はＳＱＬ挿入ステートメントによって同じように扱われるため、１つの型のデータがある。かかる挿入をハンドリングするＣＧＤＭは以下になる。
{ input: {
{“table1.column1”, “”},
{ “table1.Column2”, “” },
{ “table1.Column3”, “” },
…
}}
【００６０】
マスター／詳細テーブルに挿入するために、ＣＧＤＭは以下になる。
{“input”: {
{“Master”: {
{ “table1.column1”: “”},            
{ “table1.Column2”:“”},      
{ “table1.Column3”: “”}      
…
}}
{ “Detail”: {
[{“table2.column1”: “”},
{ “table2.Column2”: “” },
{ “table2.Column3”: “” },…] }}
}}
ここで、ＣＧＤＭは、マスターテーブルのデータ、および、詳細テーブルのデータの配列を含む。
【００６１】
１つのテーブルへの更新をハンドリングするＰＦは以下のようにＣＧＤＭを有する。
{“input”: {
“primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“values”: {
{ “table1.Column3”: “” },
{ “table1.Column4”: “”},
…
}}
}
【００６２】
マスター／詳細テーブルへの更新をハンドリングするＰＦは以下のようにＣＧＤＭを有する。
{“input”:{{“m_Primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“m_values”: {
{ “table1.Column3”: “”},
{ “table1.Column4”: “”},
…
}
},
{“d_Primarykey”: {
{ “table2.column1”: “”},
{ “table2.Column2”: “”}
…
}
},
{“d_values”: {
{ “table2.column3”: “”},
{ “table2.Column4”: “”}
…
}
},
{“d_data”: {
[{“table2.column1”: “”},{ “table2.Column2”: “”},…, 
{ “table2.Column3”: “”},{ “table2.Column3”: “”}…]
}
}}      
}
【００６３】
以下の例について、ＳＱＬ選択ステートメントが、［Ｆ：順序セクション］による［Ｅ：アグリゲーション条件］順序を有する［Ｄ：アグリゲーションセクション］によって［Ｃ：条件セクション］がグループ分けする場合の［Ｂ：テーブルセクション］からの［Ａ：出力セクション］の選択などのフォームを取ると仮定する。この入力および出力に対するデータは６つのセクションに分割される。セクションＡが、セクションＢに現れるテーブルの列またはセクションＢに現れるテーブルの列に対するＳＱＬ関数を包含し、セクションＢがテーブルおよび結合関係を包含し、セクションＣが、同じ関係における、ｃｏｌｕｍｎ＝ｖａｌｕｅ  ｏｒ  ｃｏｌｕｍｎ＞（＝）ｖａｌｕｅ  ｏｒ  ｃｏｌｕｍｎ＜（＝）ｖａｌｕｅ、ｃｏｌｕｍｎ  ＬＩＫＥ  ｖａｌｕｅ  ＳＱＬＦｕｎｃｔｉｏｎ（ｃｏｌｕｍｎ）のフォームの条件を包含し、セクションＥがＳＱＬＡｇｇｒｅｇａｔｅＦｕｎｃｔｉｏｎ（ｃｏｌｕｍｎ）＝ｏｒ＜（＝）ｏｒ＞（＝）ｖａｌｕｅｓを包含し、セクションＦが列を包含すると仮定する。
【００６４】
セクションＢにおいて必要とされるテーブルおよびそれらの結合関係情報は、データベースのスキーマから取得可能であるが、結合型情報はアプリケーションから生じるものとする。この選択ステートメントを実装するＰＦのＣＧＤＭにおける２つのテーブルの間の関係を表すための配列構造が選定できる。この選択ステートメントのＣＧＤＭは以下になる。
{{“input”:
{{“requirement”: {
[{ “tableA.column8”: “tableA.column8”},
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
},
…]}
},
{“table”: {
{[ “tableA”, “tableB”, “joinType”, “tableA.column1= tableB.column2”, “tableA.column3= tableB.column4”, …],
[ “tableC”, “tableD”, “joinType”, “tableC.column1= tableD.column2”, “tableC.column3= tableD.column4”, …],
…}}
},
{“condition”: {
{ “tableA.column5”: “v1”},      //default to tableA.column5=v1
{ “tableB.column1”: {
“value”: “v2”,            //default to SUM(tableB.column1)=v2
“FUNC”: “SUM”
}
},
…}
},
{“groupby”: [
“tableA.column6”,
{ “tableB.column2”: {
“FUNC”: “DATE”
}
},
…]
},
{“having”: {            
{ “tableB.column3”: {
“value”: “v3”,
“FUNC”: “MAX”
}
},
…}
},
{“orderby”: [
“tableA.column7”,
…]
}
}},
{“output”: 
{“results”: 
[{ “tableA.column8”: ‘’},
{ “total1”: ‘’},
…]}
}}
【００６５】
入力要件は、ＳＱＬ選択のセクションＡに対応しており、かつ、ＳＱＬ選択の出力を指定する。該要件は、配列フォーマットを指定する。｛“ｔａｂｌｅＡ．ｃｏｌｕｍｎ８”：“ｔａｂｌｅＡ．ｃｏｌｕｍｎ８”｝は、ｔａｂｌｅＡ．ｃｏｌｕｍｎ８の値を得ること、および「ｔａｂｌｅＡ．ｃｏｌｕｍｎ８」という名前に設定することを意味する。ペアの、
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
}
は、ＳＵＭ関数列、ｔａｂｌｅＢ．ｃｏｌｕｍｎ４を適用し、かつ、値を「ｔｏｔａｌ１」という名前に適用することを意味する。
【００６６】
２つ以上のＰＦを使用してバックエンド計算タスクを達成する実装について、図１０に示されるように、販売注文の出荷を演算する場合を検討する。販売注文は、（部分払いまたは在庫品の制約のため）一部出荷可能であると仮定すると、販売注文は２回以上出荷される必要がある場合がある。着信するＣＧＤＭは以下になる。
{ “Order_Shipment_Data” : 
{“input”: {
{“orderID”, “value1”}
}},
{“output”: {
{“order_info”: {
{“orderCode”:””}
{“salesmanName”:””},
{“customerName”:””}
}},
{“order_prod_info”: {
[[{“productName”:””}, {“productionDate”:””},
{“Quantity”:””},{“shippedQuantity”:””},{“quantityLeft”:””}]]
}}
}}
}
【００６７】
入力は注文ｉｄであり、必要とされる出力は、いくつかの注文情報、注文コード、販売員名およびカスタマ名、ならびに、製品情報、製品名、製造日、注文量、出荷量、および出荷される残りの量のリストを含む。
【００６８】
図１０では、ＣＧＤＭは、ＤａｔａＥｘｐａｎｄｅｒ  ＰＦ１０によって受信される。ＤａｔａＥｘｐａｎｄｅｒ  ＰＦ１０は、リレーショナルデータセット１２に接続する。ＣＧＤＭのためにＷＮＳＭ１００をマッピングする、機能させる名前空間は、以下になる。
{
{“orderID”, “order.id”};
{ “orderCode”, “order.code”}
{ “salesmanName”, “employee.name” }
{“customerName”, “customer.name”}
{“productName”, “product.name”}
{“productionDate”, “product.productionDate”}
{ “Quantity”, “order.Quantity” }
}
【００６９】
マッピング後、ＣＧＤＭは以下のようになる。
{ “Order_Shipment_Data” : 
{“input”: 
{“order.id”, “value1”}
},
{“output”: {
{“order_info”: {
{“order.code”: “”}
{“employee.name”: “”},
{“customer.name”: “”}
}},
{“order_prod_info”: {
[[{“product.name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]
}}
}}
}
【００７０】
ＰＦ１０は、ＳｅｌｅｃｔおよびＰａｃｋｅｒという２つのＣＦを有する。Ｓｅｌｅｃｔ  ＣＦは、３つのインスタンス、１０２、１０４、および１０６を作動させる。Ｐａｃｋｅｒ  ＣＦは１つのインスタンス１０８を作動させる。Ｓｅｌｅｃｔは、リレーショナルデータベースに対して上の例の型ＳＱＬ選択を行い、Ｐａｃｋｅｒ  ＣＦは、この入力全てを、データメッセージ（例えば、ＣＧＤＭ）の対応する入力部分および出力部分にパッケージングし、データメッセージをＬｏｏｐＰＦ１４に送る。ＰＦ１４は、入力として配列ＡおよびＢを取る１つのインスタンスを作動させる、ＫｅｙＭａｔｃｈＬｏｏｐと呼ばれる１つのＣＦを有し、配列Ｃを出力する。Ａ、Ｂ、およびＣにおけるそれぞれの要素は、キー部分および値部分を有する。要素のキーは、名前／値のシーケンスである。２つのキーは、２つのキーの名前値シーケンスの長さが同じである場合同じ型であり、シーケンスのそれぞれの位置の２つの名前／値ペアについて、名前は同じである。２つのキーは、同じ型を有しかつ対応する名前の値が等しい場合、等しい。ＡおよびＢは同じ型のキーを有する。ＫｅｙＭａｔｃｈＬｏｏｐのアルゴリズムは以下になる。
For each element a of A 
Create an element c with key part same as a
if there is an element b of B with a.key==b.key {
value part of c is computed from value parts of a 
and b by computation rule1.
}
else {
value part of c is computed from value parts of a 
and b by computation rule2.
}
add c to
【００７１】
計算規則１および計算規則２は、Ｃａｌｃｕｌａｔｏｒ  ＰＦ１６によって行われる。ＰＦ１６は、３つの計算、Ｅｑｕａｌ、Ｚｅｒｏ、およびＭｉｎｕｓを有する。ＰＦ１０に対するＯｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿ＤａｔａのＣＧＤＭは以下になる。
{“Order_Shipment”: 
{“Select.order”:  
{
{ “input”: {
{ “requirement”: {
{“order.code”: “order.code”}
{“salesman.name”: “salesman.name”},
{“customer.name”: “customer.name”}
}},
{ “condition” : {
{“order.id”, “Order_Shipment_Data.input.‘order.id’” }
}}, 
{ “table” : {
{[“order”, “salesman”, “inner join”, “order.salesmanID=salesman.id”],
[“order”, “customer”, “inner join”, “order.customerID=customer.id”]}
}}
}},
{ “output”: 
{ “result”: “Order_Shipment_Data.output.order_info”}
}}      
}},
{“Select.orderProduct”:  
{
{ “input”: {
{ “requirement”: {
[{“product.name”: “product.name”}, 
{“production.date”: “production.date”},
{“order_product.quantity”: “order_product.quantity”}]
}},
{ “condition” : {
{“order_product.orderId”, 
“Order_Shipment_Data.input.‘order.id’” }
}}, 
{ “table” : {
[“order_product”, “product”, “inner join”, 
“order_product.productId=production.id”]
}}
}},
{ “output”: { 
“result”: “”}
}}      
}}
{“Select.shipped”: 
{
{ “input”: {
{ “requirement”: {
{“product.name”: “product.name”}, 
{“production.date”:“production.date”},
{“shippedQuantity”: {“shipment.Quantity”:
{
“FUNC”: “SUM”
}}
}
}},
{ “condition” : {
{“shipment.orderid”,“Order_Shipment_Data.input.‘order.id’” }
}}, 
{ “table” : {
[“shipment”, “product”, “inner join”, “shipment.productID=product.id”]
}}
{ “aggregate” : {
[“product.name”, “product.productiondate”]
}}
}},
{ “output”: 
{ “result”: “”}
}
}}
{“packer”: {
{“input”: {
{“In”: 
{      
{“A”: “Select.orderProduct.output.Result”},
{“B”: “Select.shipped.output.Result”}
}},
{“Out”: {{“C”: “Order_Shipment_Data.output.order_prod_info”}}}
}},
{“output”: {
{“result” : “Order_Shipment_Data.output.order_prod_info”}
}}
}}
}
【００７２】
データメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの出力部分のｏｒｄｅｒ＿ｐｒｏｄ＿ｉｎｆｏは、ＰＦ１０がＰＦ１４に送るデータメッセージの出力部分を生成するための入力として使用される。ＰＦ１０は、データメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａ＿ＦｕｌｌをＰＦ１４に送る。
{“Order_Shipment_Data_Full”: {
{“input”: {
{“A”: [[{“product.name”: “v1”}, {“product.productionDate”: “v2”},
{“order_product.quantity”: “v3”}]]},
{“B”: [[{“product.Name”: “v4”}, {“product.productionDate”: “v5”},
{“shippedQuantity”: “v6”}]]}      
}},
{“output”: {
{“C”: [[{“product.Name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]}
}}
}      
}
【００７３】
ＰＦ１４に対するデータメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａ＿ＦｕｌｌのＣＧＤＭは以下になる。
{“Loop”:{
{“input”: {
{“A”:
[“Order_Shipment_Data_full.Input.A”, 
{“key”:[“product.name”, “product.productionDate”]}, 
{“value”:{{“shippedQuantity” } }]
},
{“B”:
[“Order_Shipment_Data_full.Input.B”, 
{“key”:[“product.name”, “product.productionDate”]}, 
{“value”:{{“order_product.quantity”} }]      
},
{ “C”: 
[“Order_Shipment_Data_full.output.C”, 
{“key”:[“product.name”, “product.productionDate”]}, 
{“value”:{{“order_product.quantity”},{“shippedQuantity”},{“quantityLeft”}}]
}
}},
{“output”: 
{ “result”: “Order_Shipment_Data_full.output.C”}
}
}
}
【００７４】
ＰＦ１４はＰＦ１６に２つのデータメッセージを送る。
{“Order_data”: {
{“input”: {
{“A”:{“order_product.quantity”: “v1”}}
}},
{“output”: {
{“C”:{{“order_product.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}      
}
{“Order_Ship_data”: {
{“input”: {
{“A”: {“order_product.quantity”: “v1”}},
{“B”: {“shippedQuantity”: “v2”}}      
}
{“output”: {
{“C”: {{“order_product.quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}      
}
【００７５】
Ｏｒｄｅｒ＿Ｓｈｉｐ＿ｄａｔａについてのＣＧＤＭは以下になる。
{“Order_Ship_Data”: {
{“Equal.quantity”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”:  {
“Y”: “C.order_product.quantity”            //Y=X
}}
}
},
{“Equal.quantityLeft”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”:“C.quantityLeft”
}}
}
}
{“Zero”: {
{“output”: {
“X”:“C.shippedQuantity”            //X=0
}}
}
}      
}}
【００７６】
Ｏｒｄｅｒ＿ｄａｔａについてのＣＧＤＭは以下になる。
{“Order_Data”: {
{“Equal.quantity”: {
{“input”:  {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”: “C.order_product.quantity”       
}}
}
},
{“Equal.shippedQuantity”: {
{“input”: {
“X”:“B.shippedQuantity”
}},
{“output”: {
“Y”:“C.shippedQuantity”            
}}
}
},
{“Minus”: {
{“input”: {
{“X”:“A.order_product.quantity”},
{“Y”:“B.shippedQuantity”}
}},
{“output”: {
“Z”:“C.quantityLeft”      //Z=X-Y
}}
}
}      
}}
【００７７】
データメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの出力部分は、ＣＦインスタンス１０６およびＣＦインスタンス１０８の出力部分によって形成される。そして、着信するデータメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの機能させる名前空間に逆にマッピングでき、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの送信者に送ることができる。
【００７８】
本発明の例示の実施形態は、ＣＧＤＭのマークアップおよびプロパティシートを利用する。この実施形態は線形カスケードに関して以下に論じられるが、本発明はデータのいずれの特定の編成にも限定されない。線形カスケードは＜ｓｅｌｅｃｔ＞要素のリストであり、これは、第１の要素から始まって最終の要素を除いたものであり、１つの＜ｓｅｌｅｃｔ＞要素の選択された値が該リストにおける次の＜ｓｅｌｅｃｔ＞のオプションを判断する。
【００７９】
線形カスケード入力の１つの例はＣｏｕｎｔｒｙ−Ｓｔａｔｅ−Ｃｉｔｙ入力であり、これによって、ユーザはＣｏｕｎｔｒｙのオプションから国を選択でき、Ｓｔａｔｅのオプションを判断し、ユーザはＳｔａｔｅのオプションから州を選択でき、Ｃｉｔｙのオプションを判断する。ブラウザの実装形態において、Ｃｏｕｎｔｙ、Ｓｔａｔｅ、およびＣｉｔｙはそれぞれ、＜ｓｅｌｅｃｔ＞要素によって表される。Ｃｏｕｎｔｒｙに対するイベントハンドラはＣｏｕｎｔｙ＜ｓｅｌｅｃｔ＞要素にアタッチされ、Ｓｔａｔｅに対するイベントハンドラはＳｔａｔｅ＜ｓｅｌｅｃｔ＞要素にアタッチされる。例えば、「米国」などの国が選択される時、Ｃｏｕｎｔｒｙのイベントハンドラは呼び出され、このイベントハンドラは「米国」の値を得て、｛Ｃｏｕｎｔｒｙ＝“ＵＳＡ”、Ｓｔａｔｅ［］｝のメッセージを作成し、このメッセージをバックエンドプロセスに送って「米国」の全ての州を得て、Ｓｔａｔｅ［］における値を記憶する。Ｓｔａｔｅ［］の値は次いで、Ｓｔａｔｅを表す＜ｓｅｌｅｃｔ＞に設定される。ＳｔａｔｅおよびＣｉｔｙに対するイベントハンドラは同様である。
【００８０】
本発明の一実施形態では、カスケードはリストとしてデータ構造によって表され、この場合、リストのそれぞれの要素は５つのメンバ、すなわち、ＩＤ、Ｎｅｘｔ、ＳｅｌｅｃｔｅｄＶａｌｕｅ、ｅｖｅｎｔＨａｎｄｌｅｒ、およびＯｐｔｉｏｎｓを有する。ＩＤは要素の名前を保持し、Ｎｅｘｔはリストの次の要素のＮａｍｅの値を有し、ＳｅｌｅｃｔｅｄＶａｌｕｅは選択された値を保持し、ｅｖｅｎｔＨａｎｄｌｅｒは要素のイベントハンドラ関数を保持し、Ｏｐｔｉｏｎｓは値のセットを保持する。Ｏｐｔｉｏｎｓから値を選択し、かつＳｅｌｅｃｔｅｄＶａｌｕｅを設定するアクションは、リストの要素に対して行われ得る。アクションを終えると、ｅｖｅｎｔＨａｎｄｌｅｒにおける関数は引数として要素を渡すことによって呼び出される。
【００８１】
ＩＤは任意の名前を取ることができるため、アルゴリズムは抽象的である。これらは、Ｃｏｕｎｔｒｙ、Ｓｔａｔｅ、Ｃｉｔｙ、またはＣｏｍｐａｎｙ、Ｄｅｐａｒｔｍｅｎｔ、Ｅｍｐｌｏｙｅｅ  Ｎａｍｅ、またはＣａｔｅｇｏｒｙ、Ｔｙｐｅ、Ｐｒｏｄｕｃｔ  Ｎａｍｅとすることができる。アルゴリズムは、任意の数の要素が可能とされるため、一般化される。
【００８２】
次に、リスト構造はＨＴＭＬ上でマーキングされる。ＩＤおよびＮｅｘｔを除いて、＜ｓｅｌｅｃｔ＞要素は他全てを有する。ここでのＣＧＤＭの定義において、それぞれの値は名前を有するものとするため、ＣＧＤＭ上では、Ｎｅｘｔのみが必要とされる。値の名前が、ＩＤプロパティをＨＴＭＬタグの全ての要素に加えることによって実装されると仮定する。
【００８３】
カスケードのマークアップ規則は、それぞれの＜ｓｅｌｅｃｔ＞要素に対してＮｅｘｔプロパティを加えるためのものであり、この値はカスケードにおける次の＜ｓｅｌｅｃｔ＞のＩＤの値である。１つのＨＴＭＬページにおける２つ以上のカスケードが可能である。
【００８４】
一般に、マークアップ規則は、アルゴリズムの任意の入力インスタンスに対して、これに対応する拡張コンテンツがあり、かつ、入力インスタンスおよびこの全データ特徴が拡張コンテンツから演繹できるように、ＣＧＤＭの横文規則を使用してＣＧＤＭのコンテンツを拡張するための規則として定義される。マークアップ規則はアルゴリズムに関連付けられる。
【００８５】
ＰＦ関数は、異なるカスケードにおいてさえも、全ての＜ｓｅｌｅｃｔ＞要素に対する選択イベントのイベントハンドラであってよい。この例では、ＰＦにはｃａｓｃａｄｅＰＦという名前が与えられる。ｃａｓｃａｄｅＰＦの入力は、選択された値、およびイベントを生成する＜ｓｅｌｅｃｔ＞要素である。ＨＴＭＬ全体のドキュメントオブジェクトモデル（ＤＯＭ）構造はまた、ｃａｓｃａｄｅＰＦにアクセス可能である。ＰＦのＣＧＤＭは、ＣＧＤＭ＝｛｛ｔｈｅ  ｓｅｌｅｃｔｅｄ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ｝、ＤＯＭ｝と見なすことができ、入力部分は、｛｛ｔｈｅ  ｓｅｌｅｃｔｅｄ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ｝、｛Ａｌｌ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ  ｏｆ  ｔｈｅ  ｃａｓｃａｄｅ｝｝であり、出力部分は、｛｛ｔｈｅ  ｎｅｘｔ  ｅｌｅｍｅｎｔ  ｏｆ  ｔｈｅ  ｓｅｌｅｃｔｅｄ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ｝｝である。
【００８６】
全てのカスケードは、種々のＨＴＭＬページにおいてさえも、同じｃａｓｃａｄｅＰＦを使用し、また、同じＣＧＤＭ名を使用できるため、ｃａｓｃａｄｅＰＦのＶＭＳＳストアはいずれのルックアップに対しても１つのＶＭＳＳを返すように構成可能である。ｃａｓｃａｄｅＰＦの例示のＣＦ関数は、ｉｎｉｔＲｅｓｔＥｌｅｍｅｎｔ（ＣｕｒｒｅｎｔＥｌｅｍｅｎｔＮａｍｅ名）であり、これは、ＩＤ＝ｎａｍｅの現在の要素について、次の要素から最後の要素まで全てに対するオプションを再設定し、Ｒｅｓｕｌｔｓ  ｒ＝ｇｅｔＶａｌｕｅｓＦｒｏｍＢａｃｋｅｎｄ（Ｃｏｎｄｉｔｉｏｎ  ｃｏｎｄｉｔｉｏｎ、Ｒｅｓｕｌｔｓ  ｒ、ＢａｃｋｅｎｄＰｒｏｃ  ｐ、ＣＧＤＭＮａｍｅｐＣＧＤＭＮａｍｅ）、これは、ＣＧＤＭをパッケージングし、バックエンドプロセスｐを呼び出し、ｐＣＧＤＭＮａｍｅという名前のＣＧＤＭを渡し、ｓｅｔＯｐｔｉｏｎ（Ｒｅｓｕｌｔｓ  ｒ）とする、つまり、ＩＤ＝ｒ．ｎａｍｅの＜ｓｅｌｅｃｔ＞のオプションを設定する。ＣＧＤＭは次のフォーマットを有する。
{pCGDMName: {      
{Input: {Condition:{name:value}}}, {Output:{Results:{r:NULL}}
}
【００８７】
ｃａｓｃａｄｅＰＦは＜ｓｅｌｅｃｔ＞要素全てに対して使用できるため、ＰＦが受信する、選択された＜ｓｅｌｅｃｔ＞要素は、異なる＜ｓｅｌｅｃｔ＞要素に対して選択が行われる時、異なる。そのため、直接可変マッピング（ＶＭ）は不可能である。しかしながら、ＣＦの引数はマークアップおよびＣＧＤＭから演繹可能である。これを規則ベースのＶＭ（ＲＢＶＭ）と呼ぶ。
【００８８】
バックエンドにおいて、ｈａｎｄｌｅＤＢＳｅｌｅｔｉｏｎと呼ばれるＰＦを有することができ、これは、設定されたＳＱＬ選択実装形態を包含する。通常、＜ｓｅｌｅｃｔ＞に対するオプションの値は、ＳＱＬ選択を作動させることによって取得可能である。ｃａｓｃａｄｅＯｐｔｉｏｎｓＣＧＤＭをＣＧＤＭの名前として割り当て、ｇｅｔＶａｌｕｅｓＦｒｏｍＢａｃｋｅｎｄはｈａｎｄｌｅＤＢＳｅｌｅｃｔｉｏｎに渡される。
【００８９】
ＲＢＶＭを使用して、ＰＦに対するＶＭＳＳは以下になる。
{initRestElement: RBVM}
{getValuesFromBackend: {{condition: RBVM }, {r : RBVM }, {p: handleDBSelection },{pCGDMName: cascadeOptionsCGDM }}}
{ setOptions: { {r: getValuesFromBackend.r}}
【００９０】
ＣＦの呼び出し元は以下になる。
initRestElementCaller(RBVM, CGDM, CFResults)
{
name = get the ID’s value of the selected <select> element
initRestElement(name);
}
getValuesFromBackendCaller(RBVM, CGDM, CFResults)
{
(name, value) = get the ID’s value and the selected value of the selected 
<select> element
name = get the ID’s value of the next element of the selected <select> element
r = getValuesFromBackend(value, name, handleDBSelection, cascadeOptionsCGDM);
add r to CFResults.
}
setOptionsCaller(RBVM, CGDM, CFResults)
{
r = get getValuesFromBackend.r from CFResults
setOptions(r);
}
【００９１】
ＲＢＶＭの利点は、新しいカスケードが加えられる時、またはカスケードの長さが延長される時、コードの規則処理部分が変更されないことである。選定したアルゴリズムが抽象的でありかつ一般化されるため、全てのカスケードは同じコードを使用できる。
【００９２】
ＣＦＣａｌｌｅｒｓの実装形態は、マークアップ規則による影響を受ける。ＣＦの新しいＣＦＣａｌｌｅｒはマークアップ規則に対して開発される必要がある。マークアップ規則に起因して、ＣＦは２つ以上のＣＦＣａｌｌｅｒを有することができる。
【００９３】
マークアップは、相互参照としてＣＧＤＭの値の名前を使用して、等しいまたはより表現的な横文規則を有する別個のメッセージに対して行われ得る。別個のマークアップメッセージを、ＣＧＤＭのプロパティシート（ＰＳ）と呼ぶ。いずれのＣＧＤＭもこれにアタッチするＰＳを有することができる。開発時間において、ＣＧＤＭの名前インスタンス（ＮＩ）が既知であるため、ＰＳは開発時間にＣＧＤＭにアタッチできる。
【００９４】
本発明の例示の実施形態を説明したが、本発明は、開示された実施形態に限定されず、本開示の趣旨および範囲内に含まれるさまざまな修正および等価の配置構成に及ぶことが意図されることは、理解されたい。
【図１】
2018521438.tif 000003
【図２】
2018521438.tif 000004
【図３】
2018521438.tif 000005
【図４】
2018521438.tif 000006
【図５】
2018521438.tif 000007
【図６】
2018521438.tif 000008
【図７】
2018521438.tif 000009
【図８】
2018521438.tif 000010
【図９】
2018521438.tif 000011
【図１０】
2018521438.tif 000012
【手続補正書】
【提出日】平成30年3月9日(2018.3.9)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
本願は、２０１５年７月１６日に出願された米国特許仮出願第６２／１９３，１５１号に対する優先権を主張するものである。
【０００２】
本開示は、一般的に、コンポーネントベースのソフトウェア開発技法に関する。
【背景技術】
【０００３】
手続き型プログラミングは、手続き呼び出しの概念に基づいて構造化プログラミングから導出されるプログラミングパラダイムである。ルーチン、サブルーチン、または関数としても既知である手続きは、実施されるべき一連の計算ステップを包含する。手続き型プログラミング言語の例は、Ｃ、フォートラン、およびパスカルを含む。
【０００４】
オブジェクト指向プログラミングにおいて、インターフェースを使用してビヘイビア（方法）およびデータ（メンバまたは属性）を明らかにするオブジェクトにプログラミングタスクを分類することに焦点を置いている。手続き型プログラミングは、データ構造に対して演算するための手順を使用するが、オブジェクト指向プログラミングは、この２つをひとまとめにするため、クラスのインスタンスである「オブジェクト」はそれ「自体の」データ構造で演算する。
【０００５】
コード再利用は、ソフトウェア開発の効率を高めるための根本的なやり方である。関数は最小の再利用可能な単位または構造である。手続型プログラミングまたはオブジェクト指向プログラミングのどちらかにおける関数呼び出しは、ステートメントレベルで実装される。呼び出される関数の引数に対応する変数は、宣言され、値が設定され、呼び出された関数に渡される必要があり、返された値は変数に設定され、かつ後の計算に使用される。これらのステートメントによって呼び出しと呼び出された関数との間に結合が生じ、呼び出す関数の再利用可能性が低減する。手続き型プログラミングまたはオブジェクト指向プログラミングのどちらかにおいてソフトウェアを書き込む時、多くのアプリケーション特有のデータ変数は、ステートメントレベルで宣言かつ使用される必要がある。これらのステートメントはアプリケーション特有であるため、他のソフトウェアでは再利用可能ではない。これらのステートメントは、ソフトウェアにおいて再利用されたコードと同じプログラミング言語で実装され、再利用されたコードと混合される。ソフトウェアの維持および修正は、読み出しかつ区別する必要があり、これらのステートメントを理解しかつ変更する。これは、ステートメントが他の誰かによって書き込まれる時にとりわけ時間がかかる。
【０００６】
この発明において、計算目標データメッセージと呼ばれる特殊データ構造およびこのプロパティシートにおいてソフトウェアのコード部分（関数）外の全てのアプリケーション特有の変数を宣言する、ソフトウェア開発方法が開示される。方法はまた、関数間の結合を除去する。関数は、相互に独立しており、これらの再利用性は高められる。関数はまた、いずれのアプリケーションにも関連していない純粋なアルゴリズム関数となり、いずれのアプリケーションにおいても使用可能である。これによって、さらに、関数の再利用性が高まる。計算は、計算目標データメッセージにおける変数を関数の引数にマッピングすること、および、関数を実行し、関数の計算結果を計算目標データメッセージにマッピングし戻すことを実装するために部分関数を使用することによって達成される。部分関数は、計算目標を達成するために関数をアセンブルすることによって、オーガナイザのように動作する。ソフトウェアにおけるアプリケーション特有の情報、アプリケーション特有のデータ変数、および、計算時にそれらを使用することは、コード（関数）とは異なるように実装され、容易に特定、理解、および修正可能である。ソフトウェアのコード部分は純粋なアルゴリズム関数であり、いずれのアプリケーション特有の情報も包含しない。
【０００７】
組み立てラインは、最終組立品が製作されるまで、部品が順に加えられる場合に、半製品の組立品がワークステーション間で移動する際に、交換可能部品が加えられる製造プロセスである。組み立てラインを使用することによって、完成品はより速くかつより少ない労力で組み立て可能である。
【０００８】
よって、ソフトウェアを組み立てラインの様式で構築できるようにする、コンポーネントまたは部分ベースの機構が必要とされている。
【発明の概要】
【発明が解決しようとする課題】
【０００９】
本発明の例示の実施形態によると、サービスを行うためにコンピュータコードをアセンブルする方法が提供される。方法は、サービスの入力／出力（Ｉ／Ｏ）要件を複数のＩ／Ｏキー／値ペアを含む対応するデータメッセージに変換することと、入力引数としてデータメッセージを受信するようにプログラムの部分関数（ＰＦ）を構成することと、計算関数（ＣＦ）の引数に、かつＩ／Ｏキー／値ペアにマッピングするキーペアを含む可変マッチング構造（ＶＭＳ）セット（ＶＭＳＳ）を生成することと、ＶＭＳＳを使用して計算関数（ＣＦ）を呼び出すようにＰＦを構成することであって、ＣＦがサービスに関連している演算を行うように構成される、構成することとを含む。
【００１０】
本発明の例示の実施形態によると、サービスを行うように構成されるコンピュータプログラムを実行する方法が提供される。コンピュータプログラムは、入力引数として複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含むデータメッセージを受信するように構成される部分関数（ＰＦ）を含む。方法は、データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造（ＶＭＳ）を含む、検索することと、検索されたデータ構造におけるそれぞれの要素について、要素の名前を使用して計算関数（ＣＦ）を検索し、かつ［要素のＶＭＳおよびデータメッセージを使用して検索されたＣＦを呼び出すことと、を含む。
【００１１】
本発明の例示の実施形態は、添付の図面と併せて、下記の説明からより詳細に理解可能である。
【図面の簡単な説明】
【００１２】
【図１】本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示す図である。
【図２】方法を実行するために使用可能である例示のコンピュータシステムを示す図である。
【図３】本発明概念の例示の実施形態に従ってソフトウェアの部分関数を構成する方法を示す図である。
【図４】本発明概念の例示の実施形態に従ってソフトウェアの部分関数を実行する方法を示す図である。
【図５】本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示す図である。
【図６】本発明概念の例示の実施形態において（Ａ）は、使用可能である例示のデータメッセージを示す図、（Ｂ）は、使用可能である例示の可変マッチング構造セットを示す図、（Ｃ）は、例示の計算関数の入力引数および出力引数の例を示す図である。
【図７】本発明概念の例示の実施形態に従って、アセンブルされたソフトウェアの部分関数の実行を示すフロー図である。
【図８】本発明概念の例示の実施形態に従って、ユーザがソフトウェアをアセンブルできるようにする方法を示す図である。
【図９】本発明概念の例示の実施形態に従って部分関数を実行する方法を示す図である。
【図１０】本発明概念の例示の実施形態に従って、適用されたデータメッセージに応答して実行される部分関数の例示のシーケンスを示す図である。
【発明を実施するための形態】
【００１３】
本発明概念は、本開示の例示の実施形態が示されている添付の図面を参照して、より詳細に説明される。図面全体を通して、同じまたは同様の参照番号は、同じまたは同様のコンポーネントを表すために使用される。しかしながら、本発明概念は、さまざまなやり方で実装可能であるため、本明細書に開示される実施形態に限定されると理解されるべきではない。むしろ、それらの実施形態は、当業者に本開示の範囲を伝えるために、本開示を徹底的かつ完全に理解するように提供される。
【００１４】
コンポーネントベースのソフトウェアシステムおよび開発方法について本明細書に説明する。下記の説明では、本発明をより徹底的に理解してもらうために、多数の具体的な詳細が示される。しかしながら、本発明が、これらの具体的な詳細なしで実践可能であることは、当業者には明らかとなろう。他の例では、本発明を不明瞭にすることを回避するために、周知の特徴は詳細には説明されていない。
【００１５】
本明細書において言及されるコンピュータコードデバイス（例えば、方法、クラス、ライブラリ）は、データ記憶媒体に記憶されてよい。本明細書において使用されるような「データ記憶媒体」と言う用語は、コンパクトディスク、ハードディスク、フロッピーディスク、テープ、光磁気ディスク、ＰＲＯＭ（ＥＰＲＯＭ、ＥＥＰＲＯＭ、フラッシュＥＰＲＯＭなど）、ＤＲＡＭ、およびＳＲＡＭなどの全てのコンピュータ可読媒体を示す。
【００１６】
図１は、本発明概念の例示の実施形態に従ってソフトウェアをアセンブルする方法を示すハイレベル図である。
【００１７】
方法は、ユーザが、計算関数（ＣＦ）をコード化できるようにする（Ｓ１０１）ことを含む。例えば、テキストフィールドを含むＣＦグラフィカルユーザインターフェース（例えば、ＣＦ−ＧＵＩ）は、ユーザがＣＦのコードを入れることができるようにするコンピュータプログラムによって提供可能である。例えば、ＣＦ−ＧＵＩは、ユーザによって選択される時、ユーザが現在のＣＦのコード化を完了したことをプログラムに通知する第１のボタンを含むことができる。例として、ＣＦは、計算を行う、データベースへのクエリを行う、または、ウェブページ上にグラフィックまたはテキストを提示するためにコード化可能である。例えば、クエリによって返された結果に基づいた数学的計算を行うための計算が使用可能である。一実施形態では、それぞれのＣＦは、ユーザによって一意の名前が与えられ、かつ、１つまたは複数の入力パラメータ（本明細書ではＣＦ入力パラメータと呼ばれる）を受信するために、および、出力パラメータ（本明細書ではＣＦ出力パラメータと呼ばれる）を返すためにコード化される。例えば、ＣＦ入力パラメータおよびＣＦ出力パラメータは、整数、浮動小数、文字列、配列、ポインタなどとすることができる。
【００１８】
方法は次いで、ユーザがＣＦをコード化し終えたかどうかを判断する（Ｓ１０２）ことを含む。例えば、第１のボタンの選択は、ユーザが別のＣＦを作成することを所望していることを指示することができる。例えば、ＣＦ−ＧＵＩは、ユーザによって選択される時、ユーザがＣＦ５０を作成し終えたことをプログラムに通知する第２のボタンを含むことができる。完了したＣＦはＣＦデータベース６０に記憶可能であるため、他の符号器に利用可能である。
【００１９】
方法は次に、ユーザが、利用可能なＣＦの１つまたは複数を使用して部分関数（ＰＦ）をコード化できるようにする（Ｓ１０３）ことを含む。例えば、プログラムは、ＧＵＩにおけるＣＦデータベース６０に記憶された利用可能なＣＦの選択可能なリスト、およびＣＦが選択されたこと、およびＰＦ内のそれらの実行順序を示すペインと共に、第２のＧＵＩ（例えば、ＰＦ−ＧＵＩ）を提示することができる。例えば、ユーザは、対応するＣＦのインスタンスが対応するＰＦに必要とされる度に利用可能なＣＦのうちの１つを選択し、かつ、選択されたインスタンスを、ユーザがＣＦインスタンスを実行させることを所望する順序でペインに挿入することができる。
【００２０】
方法は次に、ユーザが全てのＰＦを作成し終えた時をプログラムが判断する（Ｓ１０４）ことを含む。例えば、ＰＦ−ＧＵＩは、ユーザによって選択される時、ユーザが全てのＰＦ７０を作成し終えたことを指示するグラフィカルボタンを含むことができる。ＰＦ７０は、ＰＦデータベース８０に記憶可能であるため、他の符号器に利用可能である。
【００２１】
方法は次いで、プログラムによって、ユーザが、ＰＦデータベース８０に記憶される利用可能なＰＦ７０の１つまたは複数を使用してソフトウェアを作成できるようにする（Ｓ１０５）ことを含む。例えば、コンピュータプログラムを使用して、ユーザが接続コードを入れることができるようにするテキストフィールド、および利用可能なＰＦ７０の選択可能なリストを提示する第３のＧＵＩをローンチするために使用可能である。例えば、ユーザは、対応するＰＦを、コンピュータプログラムの接続コードにおけるある特定の場所に挿入するためにＰＦをリストから選択可能である。一実施形態では、コンピュータプログラムは、インタープリタによって解釈されるフォームであってよい。
【００２２】
図２は、図１の方法を実装するために使用可能である例示のコンピュータシステム１０００を示す。図２を参照すると、コンピュータシステム１０００は、例えば、中央処理装置（ＣＰＵ）１００１、ランダムアクセスメモリ（ＲＡＭ）１００４、プリンタインターフェース１０１０、ディスプレイユニット１０１１、ローカルエリアネットワーク（ＬＡＮ）データ伝送コントローラ１００５、ＬＡＮインターフェース１００６、ネットワークコントローラ１００３、内部バス１００２、および例えば、キーボード、マウスといった１つまたは複数の入力デバイス１００９などを含むことができる。示されるように、システム１０００は、リンク１００７を介してデータ記憶デバイス、例えばハードディスク１００８に接続されてよい。上述されたＧＵＩはディスプレイユニット１０１１上に提示可能である。上述されたＣＦ５０、ＰＦ７０、プログラム、およびアセンブルされたソフトウェアは、メモリ１００４および／またはハードディスク１００８に記憶されてよい。
【００２３】
図３は、ＰＦをコード化するために図１のステップＳ１０３を実装するために使用可能である本発明の例示の実施形態による方法を示す。図３を参照すると、方法は、計算目標データメッセージ（ＣＧＤＭ）の入力を受信するように部分関数を構成する（Ｓ３０１）ことを含む。
【００２４】
例示の実施形態では、ＣＧＤＭは、ｉ）入力部分および出力部分、ｉｉ）名前／値フォーム（例えば、全ての値、いずれの後の計算においても変数に割り当てられる値のサブ構造は名前を有するものとする）を有し、ｉｉｉ）その構造はいくつかの横文規則（例えば、ＨＴＭＬ、ＸＭＬ、またはＪＳＯＮ）に従う。２つのＣＧＤＭは、ｉ）これらの入力部分および出力部分の両方が同じ構造を有し、かつｉｉ）該構造における全ての名前が同じである場合、同じである。ＣＧＤＭはＰＦの引数として使用される。いずれのＰＦも１つの引数しか有することができない。ＰＦは１つまたは２つ以上のＣＧＤＭを処理できる。それぞれのＣＧＤＭは対応するＶＭＳＳを有する。ＶＭＳＳは、ＣＧＤＭの計算目標をどのように達成するかをＰＦに命令する。
【００２５】
ＣＧＤＭにおける名前は、呼び出された、機能させる名前であり、アプリケーションデータに対する変数を表す。
【００２６】
全てのＰＦは同じインターフェースを有する。例えば、それぞれの部分関数は、部分関数の起動パラメータまたは引数と呼ばれる場合があるＣＧＤＭで起動されるように構成される。ＣＧＤＭは、入力パラメータＸ（例えば、入力：Ｘ）、および出力パラメータＹ（例えば、出力：Ｙ）を含み、この場合、ＸおよびＹは名前（キー）／値フォームを有する任意のデータ構造とすることができる。Ｘ部分において、名前は値を有し、Ｙ部分の値は、部分関数によって埋められるように空白である。２つのＣＧＤＭは、これらの入力部分および出力部分の両方が同じ構造を有し、かつ該構造における全ての名前（キー）が同じである場合、同じである。それぞれのＣＧＤＭは一意の名前を有する。この入力部分セットの全ての名前（キー）の値を有するＣＧＤＭは、ＣＧＤＭのインスタンスと呼ばれる。ＰＦは、埋められた値を有するＣＧＤＭの出力部分と同じデータ構造を返す。ＰＦは引数としてのいずれのＣＧＤＭも受け入れる。
【００２７】
ＰＦは１つまたは複数の計算関数（ＣＦ）を包含する。いずれの関数もＣＦとすることができる。ＰＦは、ＰＦがＣＦをどのように実行するかがＣＧＤＭだけでなく、可変マッチング構造（ＶＭＳ）と呼ばれるデータ構造によっても判断されるため、いずれのＣＧＤＭも引数として受け入れ可能である。ＰＦはＣＦ呼び出し元を通してＣＦを実行する。ＣＦ呼び出し元は、引数として、ＣＧＤＭ、ＶＭＳ、およびＣＦＲｅｓｕｌｔｓを受け入れる。呼び出すためにＰＦには一定のインターフェースが与えられる。ＣＦ呼び出し元は、ｉ）ＣＧＤＭおよびＶＭＳに従ってＣＦおよび呼び出しの引数を準備し、ｉｉ）ＣＧＤＭおよびＶＭＳに従ってＣＧＤＭの出力部分を設定し、ｉｉｉ）後のＣＦの実行による使用を可能にするためにＣＦＲｅｓｕｌｔｓに結果を保存する。
【００２８】
本発明の一実施形態では、ｉ）完全ＣＦおよびｉｉ）部分ＣＦの、２つの型のＣＦ関数が存在してよい。完全ＣＦはＰＦを呼び出さず、インターフェース要件を完了させている。部分ＣＦはＰＦを呼び出し、インターフェース要件を部分的に終わらせている。インターフェース要件がどのように行われるかは、どのＰＦが呼び出されるか、およびＰＦが何を行うように構成されるかに左右される。
【００２９】
ＶＭＳはＣＦとＣＧＤＭとの間のデータをマッピングするため、ＣＦはＣＧＤＭと直接的な関係がなく、すなわち、アプリケーションデータ変数と何の関係もない。ＣＦは純粋なアルゴリズム関数とすることができる。ＶＭＳはＣＦをＣＧＤＭから分離し、ＣＧＤＭが部分ＣＦによって送られる場合、ＣＧＤＭを処理するＣＦはまた、部分ＣＦにバインドされない。いずれのＣＦの間にも呼び出しアクションはないため、ＣＦの間に結合はなく、相互に独立しており、それぞれのＣＦは、あるアルゴリズムを他のアルゴリズムを知らずに実装するように独立して開発可能である。
【００３０】
ＣＦがＰＦを呼び出す時、ＣＧＤＭを準備し、かつ、引数としてのＣＧＤＭを呼び出したＰＦに渡す。ＣＧＤＭにおける値の命名は、無矛盾の命名規則に従う場合がある。ＣＦが呼び出すＰＦの名前、およびＣＦが作成するＣＧＤＭの名前は、ＣＦのＶＭＳにおいて指定可能である。
【００３１】
ＶＭＳＳはＣＦを接続する制御を行い、部分ＣＦはＰＦを接続する制御を行う。ソフトウェアは所与の設計に従って、ＰＦおよびＣＦを接続するためにＶＭＳおよびＶＭＳＳを操作することによって形成可能である。
【００３２】
１つのＣＧＤＭについて、ＣＧＤＭの計算構造のＣＧＤＭの計算目標を達成するために（２つ以上のＰＦを伴う場合がある）全てのＰＦおよびＣＦの実行シーケンスを呼び出す。
【００３３】
図６Ａは、部分関数に引数として渡される可能性があるＣＧＤＭの一例である。この例では、ＣＧＤＭはＪａｖａＳｃｒｉｐｔ（登録商標である）Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する。ＣＧＤＭは、１つまたは複数の入力キー／値ペアおよび出力キー／値ペアを含む。ＣＧＤＭは、入力キー／値ペアおよび出力キー／値ペアを抽出するためにパーサーまたはインタープリタによって使用可能である識別子を含むことができる。
【００３４】
図６Ａに示される例において、ＣＧＤＭにおける入力パラメータ識別子は「入力」という名称が付けられ、出力パラメータ識別子は「出力」という名称が付けられる。例えば、ＣＧＤＭをパースするパーサーが「入力」の識別子を認識後、パーサーは、次の左中括弧「｛」と右中括弧「｝」との間に位置する次の要素がキー／値入力パラメータペアであると仮定することができる。例えば、ＣＧＤＭをパースするパーサーが「出力」の識別子を認識後、パーサーは、次の左中括弧「｛」と右中括弧「｝」との間に位置する次の要素がキー／値出力パラメータペアであると仮定することができる。例えば、キー／値ペアは、セミコロン「；」によって分離可能であり、所与のキー／値ペアのキーおよび値はコロン「：」によって分離可能である。
【００３５】
図６Ａは、入力パラメータキー／値ペアを示すための「入力」という用語の使用、出力パラメータキー／値ペアを示すための「出力」という用語の使用、キー／値ペアの開始を示すための「｛」という用語の使用、キー／値ペアの終わりを示すための「｝」という用語の使用、および、パーサーがキーと値とを区別できるようにするための「：」という用語の使用を示すが、本発明はこれらに限定されない。例えば、これらの用語は、実行者によって所望されるように、他の語または記号に変更されてよい。
【００３６】
図３に戻って参照すると、方法は、ユーザが計算関数（ＣＦ）の新しいインスタンスを呼び出すために部分関数を所望しているかどうかを判断する（Ｓ３０２）ことを含む。新しいインスタンスは、これが、挿入するための特定的なＣＦがリクエストされた１回目である、または、リクエストされた挿入がＣＦ（例えばＣＦ２）のインスタンスを異なるＣＦ（例えばＣＦ１）の後に挿入させることになることを意味する。説明を簡単にするために、図６Ｂに示されるような、第１の計算関数ＣＦ１および第２の計算関数ＣＦ２のみが利用可能であると仮定する。ユーザがＣＦの新しいインスタンスをリクエストしている場合、方法は、特定のＣＦを特定するためにラベルを挿入する（Ｓ３０３）。例えば、ユーザは、第１の計算関数ＣＦ１が使用されることをリクエストしているため、方法は、「ＣＦ１」などのラベルを可変マッチング構造シーケンス（ＶＭＳＳ）に挿入して、第１の計算関数ＣＦ１が呼び出されるように特定する。ＶＭＳＳは、完了すると、ペアのシーケンスを含むことになり、この場合、それぞれのペアは所与のＣＦ（例えば、ＣＦ１）およびＶＭＳ（例えば、ＣＦＮａｍｅ、ＶＭＳ）の名前を含む。例えば、完了したＶＭＳＳは、｛｛ＣＦ１、ＶＭＳ１｝、…、｛ＣＦＮ、ＶＭＳＮ｝｝のペアを含むことができ、この場合Ｎは１またはそれ以上である。ＶＭＳＳはＣＧＤＭに関連付けられ、ＶＭＳＳにおける全てのＶＭＳはＣＧＤＭの全ての名前の（キーの）値を埋める。すなわち、ＶＭＳＳはＣＧＤＭの計算目標を満たす。ＶＭＳＳは、ＰＦに、ＣＧＤＮの計算目標をどのように達成するかを命令する。
【００３７】
次に、方法は、ＣＦインスタンスの入力パラメータをＣＧＤＭ内の入力パラメータにマッピングし、かつ、ＣＦインスタンスの出力パラメータをＣＧＤＭ内の出力パラメータを出力するためにマッピングする可変マッチング構造（ＶＭＳ）をユーザが構成できるようにする（Ｓ３０４）ことを含む。ＶＭＳは、ＰＦに、１つのＣＦをどのように実行するかを命令する。
【００３８】
例えば、図６Ｂは、それぞれのキーペアがセミコロン「；」で分離される複数のキーペアを有する第１のＣＦ１  ６１１のために構成される第１のＶＭＳ６０１の例を示す。例えば、第１のＶＭＳ６０１の第１のキーペア「ａ：ｘ」における第１のキー「ａ」は、第１のＣＦ１  ６１１の第１の入力パラメータ「ａ」に対応し、第１のキーペア「ａ：ｘ」における第２のキー「ｘ」は図６Ａに示されるＣＧＤＭ６００の第２の入力パラメータ「ｘ：２」に対応する。例えば、第１のＶＭＳ６０１の第２のキーペア「ｂ：ｙ」における第１のキー「ｂ」は第１のＣＦ１  ６１１の第２の入力パラメータ「ｂ」に対応し、第２のキーペア「ｂ：ｙ」における第２のキー「ｙ」は図６Ａに示されるＣＧＤＭ６００の第３の入力パラメータ「ｙ：３」に対応する。例えば、第１のＶＭＳ６０１の第３のキーペア「ｃ：ｚ」における第１のキー「ｃ」は第１のＣＦ１  ６１１の出力パラメータ「ｃ」に対応し、第３のキーペア「ｃ：ｚ」における第２のキー「ｚ」は図６Ａに示されるＣＧＤＭ６００の出力パラメータ「ｚ：ＮＵＬＬ」に対応する。図６Ｃは、ＣＦに対する呼び出しの例を示す。ＣＦの引数が複合型である場合、ＣＧＤＭの入力部分における同じ複合型にマッピングする場合、引数の名前がＣであり、同じ型（ＣＧＤＭの入力部分のサブ構造）の名前がＤであると仮定すると、マッピングは「Ｃ：Ｄ」と指定可能である。ＣＧＤＭの入力部分における同じ複合型にマッピングせず、そのメンバがＣＧＤＭの入力部分において分布させた名前にマッピングする場合、複合型のそれぞれのメンバのマッピングは指定される必要があり、複合型がＴであり、かつＣＧＤＭの入力部分における名前がｄ１、ｄ２、…であると仮定すると、マッピングは「Ｃ、Ｔ（「ｍｅｍｂｅｒ１：ｄ１」、「ｍｅｍｂｅｒ２：ｄ２」…）」と指定可能である。Ｃが配列型である場合、マッピングは「Ｃ：Ａｒｒａｙ［ｄ１、ｄ２、…］」と指定可能である。
【００３９】
次に、方法は、構成されたＶＭＳを、部分関数ＣＦに関連付けられたＶＭＭＳに挿入する（Ｓ３０５）。ＶＭＳは、特定されたＣＦに関連付けられていることをパーサーが認識できるように挿入される。例えば、ラべル「ＣＦ１」より下の図６Ｂに示される第１のＶＭＳ６０１は、ＰＦがＶＭＳＳに挿入されておりかつ第１の計算関数ＣＦ１に関連付けられているように構成されるＶＭＳの一例である。方法は次いで、ユーザがし終えたかどうかを判断する（Ｓ３０５）ことを含む。例えば、ＧＵＩは、計算関数（ＣＦ）を選択し、かつ、計算関数（ＣＦ）に入れ終わっていることを指示するために、ユーザによって使用可能である。ユーザが別の計算関数（ＣＦ）、または、先に選択された計算関数（ＣＦ）の別のインスタンスを選択する場合、方法はステップＳ３０２に進む。例えば、ユーザが同じＣＦ（例えば、再びＣＦ１）の別のインスタンスに入れかつＣＧＤＭの異なるパラメータをＣＦに送るとしたら、方法はステップＳ３０４に進むことになる。例えば、これによって、第１の計算関数ＣＦ１を特定する同じラベル（例えばＣＦ１）下の第２のＶＭＳ６０２が挿入されることになる可能性がある。しかしながら、ユーザが新しい計算関数（例えば、ＣＦ２  ６１２）を選択する場合、図６Ｂに示されるように、第２のラベル（例えばＣＦ２）および第３のＶＭＳ６０３が挿入されることになる可能性がある。
【００４０】
ＣＧＤＭの入力から値を取ること以外に、ＣＦの引数は、また、１つまたは複数の先に実行されたＣＦの結果から値を取ることができる。例えば、ＰＦが第１のＣＦを実行する時、ＣＦの実行の結果をＰＦの内部にあるデータ構造（例えば、ＣＦＲｅｓｕｌｔｓ構造）またはリストに記憶でき、それによって、ＰＦが同じ第１のＣＦまたは第２のＣＦを再実行する場合、その結果は、対応するＣＦが必要に応じて該結果に基づいて演算できるように、どちらのＣＦにも利用可能である。図７に示されるように、ＰＦ７０１がＰＦ呼び出しを通して呼び出される時、ＰＦ７０１はＣＦＣａｌｌｅｒ関数を通してＣＦを実行する。ＣＦＣａｌｌｅｒ関数は、複数の利用可能なＣＦＣａｌｌｅｒ関数を記憶する外部記憶領域７０２（例えば、ＣＦＣａｌｌｅｒストア）からロードされてよい。ＣＦＣａｌｌｅｒ関数は、入力として、ＣＧＤＭ、ＣＦに関連付けられたＶＭＳＳ７０３、およびＣＦＲｅｓｕｌｔｓ構造７０４を取る。ＶＭＳＳ７０３は、外部記憶領域７０５（例えば、ＶＭＳＳストア）からロードされてよい。ＣＦＣａｌｌｅｒ関数は、下記を行う。１）ＣＦの引数を宣言し、かつＶＭＳＳ７０３、ＣＧＤＭ、およびＣＦＲｅｓｕｌｔｓ構造７０４内のＣＦＲｅｓｕｌｔｓを使用してそれぞれの引数を初期化し、２）引数によってＣＦを実行し、３）その結果をＣＦＲｅｓｕｌｔｓ構造７０４に加えて、ＶＭＳＳ７０３に従ってＣＧＤＭの出力（例えば、ＣＧＤＭ．ｏｕｔｐｕｔ）を設定する。一実施形態では、それぞれのＣＦは、関連のＣＦＣａｌｌｅｒ関数を有し、それぞれのＣＦは同じインターフェースを有する。ＶＭＳＳストアは、ＰＦが呼び出される全てのＣＧＤＭに対する全てのＶＭＳＳを包含する。ＣＦＣａｌｌストアは、ＰＦが包含する全てのＣＦに関連付けられたＣＦＣａｌｌｅｒ関数を包含する。
【００４１】
図４は、本発明の例示の実施形態に従って、受信されたＣＧＤＭのＰＦ呼び出しを実行するための方法を示す。方法は、ＣＧＲｅｓｕｌｔｓ構造７０４をクリアする（Ｓ４０１）ことと、ＣＧＤＭの名前を使用してＶＭＳＳストア７０５から対応するＶＭＳＳ７０３を検索する（Ｓ４０２）ことと、ＶＭＳＳ７０３におけるそれぞれの要素について、要素の名前部分を使用してＣＦＣａｌｌｅｒストア７０２からＣＦＣａｌｌｅｒ関数を検索し、かつ要素のＶＭＳ部分、ＣＧＤＭ、およびＣＦＲｅｓｕｌｔｓ構造７０４によって、検索されたＣＦＣａｌｌｅｒ関数を呼び出す（Ｓ４０３）ことと、（この時値が埋められている）ＣＧＤＭの出力をコピーする（Ｓ４０４）ことと、そのコピーを返す（Ｓ４０５）ことと、を含む。
【００４２】
ＣＦは他のＰＦを呼び出すことができる。これを行うやり方は、ＣＧＤＭを作成し、かつ、引数として作成されたＣＧＤＭをこの呼び出しに渡すことである。ＣＦが、計算するＣＧＤＭにおける値を、作成するＣＧＤＭに渡す場合、ＣＦは、計算するＣＧＤＭにあるのと同じ名前を使用するものとする。ＣＦが、ＣＦＲｅｓｕｌｔｓ構造７０４における値を、作成するＣＧＤＭに渡す場合、ＣＦＲｅｓｕｌｔｓ構造７０４にあるのと同じ名前を使用するものとする。これは無矛盾の名前規則と呼ばれる。ＣＦが別のＰＦを呼び出すためのＣＧＤＭを作成する時、無矛盾の名前規則に従うものとする。
【００４３】
全てのＰＦが同じインターフェースを有するため、種々のＰＦを呼び出す際の違いは名前によるだけである。ＰＦ名前引数は、呼び出すＰＦ全てに対するＣＦに加えられることが可能であり、その後、呼び出すＰＦはＣＦのＶＭＳにおいて指定可能である。また、作成するＣＧＤＭの名前は、ＶＭＳにおいて指定可能である。そのため、ＣＦが呼び出すのはどのＰＦか、および使用するＣＧＤＭの名前が何かについては、ＣＦの開発後に判断可能である。
【００４４】
一実施形態において、データ記憶パラメータの全ては、名前（キー）／値フォームである。データ記憶フォーマットは、ＣＧＤＭと共に種々の横文規則を有することができる。
【００４５】
データ記憶域およびＣＧＤＭにおける名前は、種々のユーザよっておよび種々の時に作成可能であるため、矛盾する場合がある。名前／値のセットは、セットにおける同じ名前が命名された値に対して同じ意味論的意味を記述し、かつ、セットにおける異なる名前が命名された値に対する異なる意味論的意味を記述する場合、無矛盾と言われる。無矛盾の名前／値のセットは、名前空間（ＮＳ）を形成する。ＰＦおよびこのＣＦは１つのＮＳにおいて演算する必要がある。ＣＧＤＭおよびデータ記憶域が１つのＮＳにおけるものでない場合、それらを１つのＮＳに変換するための変換が、ＣＧＤＭに適用可能である。１つのＣＧＤＭについて、ＣＧＤＭの計算目標を達成するために全てのＰＦおよびＣＦの実行シーケンスが呼び出される。
【００４６】
図５は、本発明の例示の実施形態によるソフトウェア開発プロセスを示す。プロセスは、ソフトウェアの全ての入力要件および出力要件をＣＧＤＭフォーマットに変換する（Ｓ５０１）ことと、その変換から生成されたそれぞれのＣＧＤＭの計算構造を設計し、マークアップ規則によってＣＧＤＭをマーキングし、必要に応じて新しいマークアップ規則を作成し、必要に応じて、プロパティシートを使用して新しいマークアップ規則によってＣＧＤＭをマーキングする（Ｓ５０２）ことと、設計された計算構造をサポートするようにデータ記憶域を設計する（Ｓ５０３）ことと、既存のＰＦおよび／またはＣＦを選択し、新しいマークアップ規則が加えられる場合、必要に応じて新しいＰＦおよび／またはＣＦを開発し、関わるＣＦに対して新しいＣＦＣａｌｌｅｒを開発する（Ｓ５０４）ことと、開発されたおよび／または選択されたＰＦならびにＣＦを接続するためにＶＭＳおよびＶＭＳＳを作成する（Ｓ５０５）こととを含む。
【００４７】
一実施形態では、ステップＳ５０５は、入力部分の値、すなわち、ＣＧＤＭの名前インスタンス（ＮＩ）なしでＣＧＤＭを呼び出すことによって実施される。ＮＩは、値のない入力部分および出力部分によるＣＧＤＭである。一実施形態では、他のＰＦを呼び出すそれぞれのＣＦは開発モード（ＤＶ）処理を有する。ＤＶにおいて、ＣＧは、計算するＣＧＤＭのＮＩを取り、かつ、計算するＣＧＤＭに対して作成する全てのＣＧＤＭのＮＩを、（例えば、ファイルのような）持続的データ記憶域に出力する。出力されたＮＩは呼び出されたＰＦのＣＧＤＭのコンテンツを指定する。ＶＭＳおよびＶＭＳＳはそれに応じて作成可能である。
【００４８】
図８は、本発明概念の例示の実施形態に従って、利用可能な部分関数（ＰＦ）の１つまたは複数を使用してソフトウェアを生成する方法を示す。方法は、利用可能なＰＦからＰＦを選択するためにユーザにクエリを行う（Ｓ８０１）ことと、入力名前（キー）／値ペアおよび出力キー／値ペアを入れるためにユーザにクエリを行う（Ｓ８０２）ことと、入れられたデータに基づいてＣＧＤＭをフォーマットする（Ｓ８０３）ことと、入力引数としてフォーマットされたＣＧＤＭによってＰＦ呼び出しを挿入する（Ｓ８０４）ことと、ユーザがＰＦ呼び出しをし終えたかどうかを判断する（Ｓ８０５）こととを含む。ユーザがし終えてない場合、方法は、新しいＰＦを選択するためにユーザにクエリを行うようにステップＳ８０１に進む。ユーザがし終えている場合、方法は終了する。
【００４９】
図９は、本発明の例示の実施形態に従って、ＰＦ呼び出しを含むソフトウェアを解釈する方法を示す。方法は引数としてＰＦ呼び出しに渡された所与のＰＦおよびＣＧＤＭを特定するためにＰＦ呼び出しをパースする（Ｓ９０１）ことを含む。方法は次いで、特定されたＰＦに関連付けられたＶＭＳＳをロードし、かつ、特定されたＣＧＤＭ内の入力キー／値ペアおよび出力キー／値ペアを特定する（Ｓ９０２）ことを含む。方法は、次いで、ロードされたＶＭＳＳの次の行をパースする（Ｓ９０３）ことを含む。方法は次いで、パースされた行がＣＦラベルを含むかどうかを判断する（Ｓ９０４）。例えば、次の行が図６Ｂに示されるＶＭＳＳの第１の行である場合、方法は、ＣＦ１のＣＦラベルを特定したと結論付けることになる。ＣＦラベルが特定されたと判断される場合、方法は、判断されたＣＦラベルから呼び出すための特定のＣＦを特定し、かつ、ＶＭＳＳの次の行をパースする。その後、方法が、次の行がＣＦラベルでない（すなわち、次の行がＶＭＳに対応する）と判断する場合、方法は、ＶＭＳの現在のキーペアの第１のキーを特定されたＣＦの選択されたＩ／Ｏパラメータにマッチさせ、かつ、現在のキーペアの第２のキーを特定されたＣＧＤＭの選択されたＩ／Ｏキーにマッチさせる（Ｓ９０６）。例えば、ＶＭＳ６０１がパースされ、かつ、パースされた現在のキーペアが「ａ：ｘ」であり、特定されたＣＦがＣＦ１  ６１１である場合、方法は、現在のキーペア「ａ：ｘ」の第１のキー「ａ」をＣＦ１  ６１１の入力パラメータにマッチさせ、かつ、現在のキーペアの第２のキー「ｘ」をＣＧＤＭ６００の入力パラメータｘ：２の入力キー「ｘ」にマッチさせる。次いで、方法は、ＣＦの選択されたＩ／Ｏパラメータが選択されたＩ／Ｏキーの値を渡されるように、特定されたＣＦへの呼び出しをフォーマットする（Ｓ９０７）ことを含む。例えば、ＣＦＬ１  ６１１の入力パラメータ「ａ」は値「２」が渡されるが、これは、第１のキー「ａ」が「ｘ」にマッチさせられ、ｘは２に設定される（例えば、「ｘ：２」）からである。方法は次いで、ＶＭＳのあらゆるキーペアに対するこれらのマッチングステップを繰り返す。方法は、し終えたかどうかを判断するために、ＶＭＳの最後のキーペアがパースされたかどうかを判断する（Ｓ９０８）。方法が終えられていない場合、ステップＳ９０６に進むことによって、ＶＭＳの次のキーペアに進行する。方法が終えられている場合、ステップＳ９０２に進んで、ＶＭＳＳの次の行をパースして、先に特定されたＣＦラベル下で新しいＣＦラベルまたは別のＶＭＳのどちらかを見つける。
【００５０】
図６ＡはＣＧＤＭのＪＳＯＮフォーマットの使用を示すが、本発明はこれに限定されない。例えば、ＪＳＯＮフォーマットは、ハイパーテキストマークアップ言語（ＨＴＭＬ）フォーマットまたは拡張マークアップ言語（ＸＭＬ）フォーマットと置き換え可能である。マークアップ規則は、アルゴリズムの任意の入力インスタンスについて、それに対応する拡張コンテンツがあるように、かつ、入力インスタンスおよびこの全データ特徴が拡張コンテンツから演繹できるように、ＣＧＤＭの横文規則を使用してＣＧＤＭのコンテンツを拡張する規則として定義される。マークアップ規則はアルゴリズムに関連付けられる。
【００５１】
本発明の一実施形態では、ソフトウェアへの入力データメッセージはＨＴＭＬフォーマットであり、ＣＧＤＭはＪＳＯＮフォーマットであり、データ記憶域はリレーショナルデータベースであり、これによってウェブ開発環境が可能になる。入力をハンドリングする部分関数はウェブブラウザにおいて作動し、フロントエンド部分関数と呼ばれる場合がある。サーバ側を作動させる部分関数はバックエンド部分関数と呼ばれる場合がある。バックエンド部分関数はデータベースに接続可能である。
【００５２】
ＨＴＭＬ入力を処理する１つのＰＦは、線形カスケード入力をハンドリングするものとすることができる。線形カスケード入力の例には、州を選択後、国を選択し、次いで市を選択する入力がある。この入力は、＜ｓｅｌｅｃｔ＞のリストおよび現在の選択であり、出力は次のオプション型配列である。マークアップ規則は、リストを表現する任意の規則とすることができる。マークアップ規則の例には、第１のリストを＜ｓｅｌｅｃｔ  Ｃａｓｃａｄｅ＝“ｃｓ１”ｃｓ１＝”１”ｍＮａｍｅ＝”ｎａｍｅ１”…＞とマーキングする、第２のリストを＜ｓｅｌｅｃｔ  Ｃａｓｃａｄｅ＝”ｃｓ１”ｃｓ１＝”２”ｍＮａｍｅ ＝”ｎａｍｅ２”…＞とマーキングする、第３のリストを＜ｓｅｌｅｃｔ  Ｃａｓｃａｄｅ＝”ｃｓ１”ｃｓ１＝”３”ｍＮａｍｅ ＝”ｎａｍｅ３”…＞とマーキングする、などがある。カスケードは計算名であり、Ｃａｓｃａｄｅ＝”ｃｓ１”はｃｓ１＝’ｎ’であるインスタンスｃｓ１を宣言し、その後、リストにおける位置を宣言する。ＰＦは＜ｓｅｌｅｃｔ＞要素のｏｎＳｅｌｅｃｔイベントによってトリガされる。同じｏｎＳｅｌｅｃｔイベントハンドラのｃａｓｃａｄｅＨｎｄｌｅｒは全ての＜ｓｅｌｅｃｔ＞に対して設定される。ｃａｓｃａｄｅＨｎｄｌｅｒはこの型の入力要件および出力要件をハンドリングする部分関数である。ハンドラのアルゴリズムは以下になる。
Get instance name from Cascade=”instance_i”; 
Get position number from instance_i=”n”;
Get selected value v and name n1 of the current <select> 
Get name n2 of the next <select>
Send a data message of the form 
{{ “input”: 
{“n1” : v} 
},
{ “output”: {
[{“n2”:0}]}
}}
to a backend component
Set return result to the next <select>
【００５３】
１つのＨＴＭＬデータメッセージにおける任意の長さで任意のアプリケーションの意味を有する任意の数のカスケード入力は、この部分関数によってハンドリングされることが可能である。部分関数は、上記のアルゴリズムを実装する１つのＣＦのみを包含すると考えることができ、これにおいて、純粋なカスケードが実装され、Ｃｏｕｎｔｒｙ−Ｓｔａｔｅ−ＣｏｕｎｔｙまたはＧｒａｄｅ−Ｃｌａｓｓ−ＳｔｕｄｅｎｔＮａｍｅのどちらかであるカスケードに割り当てられるアプリケーションの意味に関係がない。より小さい関数粒度のカスケード実装形態は後に示される。
【００５４】
入力の別のケースは、スターカスケード入力と呼ばれ、この場合、いくつかの＜ｓｅｌｅｃｔ＞のオプションは、利用可能なサイズおよび色のオプションが、どのクロスが選定されたかに基づいて決定される場合のように、１つの＜ｓｅｌｅｃｔ＞によって決定される。中央マークについて、＜ｓｅｌｅｃｔ  ｓｔａｒ＝”ｓｔａｒ１”ｓｔａｒ１＝”ｎａｍｅ  ｌｉｓｔ  ｏｆ  ａｌｌ  ｅｎｄ  ｓｅｌｅｃｔ  ｎｏｄｅ”＞である。エンドノード＜ｓｅｌｅｃｔ＞がマーキングされる必要はない。中央の＜ｓｅｌｅｃｔ＞の選択がし終わると、以下のフォームのデータメッセージがバックエンドに送られる。
{
{“input”: 
{“centerName” : “v”} 
},
{ “output”: {
[{“n1”, “”}],
[{“n2”, “”}],
…
}}
}
この場合、ｎ１およびｎ２はエンドノードの名前である。返された値が配列ではなく単一値であり、かつエンドノードがテキストまたは数入力である時、これは、カスタマの名前が選定されるようにオートフィルとなり、このアドレスはオートフィルされる。
【００５５】
入力候補ハンドリングは、オートフィルの逆算である。部署および位置の入力が被雇用者の名前入力候補の入力を制限するように、現在の入力値およびいくつかの他の入力値以外は現在の入力のオプションを制限することができる。現在の入力値がテキストである時、提案された値に関して、２つ以上の解釈がある場合があり、例えば、提案された値がこのテキストで開始するまたはテキストを包含すること意味する場合がある。そのため、さらなる情報が以下のような値に対して提供される必要がある。
{
{“input”: {
{“otherValues1”: “v1”},
{“otherValues2”: “v2”},
{“currentValue”:  {
{“value”: “v3”},
{“type”: “LIKE”}
}
}
… 
},
{ “output”: {
[{“n1”, “”}]
}
}
}
ここで、ｎ１は現在の入力要素の名前である。
【００５６】
第１の要素＜ｉｎｐｕｔ  ｒａｎｇｅＩｎｐｕｔ＝”ｒｉ１”ｒｉ１＝”１”…＞、第２の要素＜ｉｎｐｕｔ  ｒａｎｇｅＩｎｐｕｔ＝“ｒｉ１”ｒｉ１＝”２”…＞、または、選択入力について、第１の要素＜ｓｅｌｅｃｔ  ｒａｎｇｅＩｎｐｕｔ＝”ｒｉ１”ｒｉ１＝”１”…＞、第２の要素＜ｓｅｌｅｃｔ  ｒａｎｇｅＩｎｐｕｔ＝”ｒｉ１”ｒｉ１＝”２”…＞といったマックアップ規則を有する範囲入力がまた、実装可能である。アルゴリズムは、他の入力によって制約集合を満足させるかどうか、または１つの入力が他の入力のオプションを制限するかどうかの、現在の入力チェックを受け入れる前のものである。入力フォーマット選定に起因して、日にち範囲入力、選択範囲入力、数値範囲入力のような数個の異なる型の範囲入力が存在する場合がある。
【００５７】
フォームは、ある数の異なる型の入力要素（テキスト、数値、リストオプション、範囲入力、カスケード入力…）を包含する。フォーム送信のアクションは、全ての要素に対する（名前、値）ペアを収集することである。フォーム送信のマークアップ規則は、入力要素のそれぞれの型に対して型記号を定義している。異なる型は、名前値へのアクセスが種々のやり方を使用する必要があることを意味する。それぞれの入力要素をその適正な型に対してマーキングする。フォーム送信に対するアルゴリズムは以下になる。
For each type {
Get all input element for the type
For each input element of the type {
Get the name and value, pack the name value into JSON format.
}      
}
mark the data message as ADD or MODIFY
send the JSON data message to a backend address
【００５８】
フォーム送信は、新しいデータのＡＤＤまたは古いデータのＭＯＤＩＦＹのどちらかとすることができる。修正について、データは最初に、いくつかの余分なデータ、キー、または参照番号と共に、バックエンドからロードされる。次いで、データは修正され、バックエンドに送られる。余分なキーデータはクッキーなどの同様の機構によってハンドリング可能である。クッキーの１つの実装形態は、特殊なタグを有するＨＴＭＬのいくつかの隠された要素を使用することである。新しいデータを加えるために、この余分なキーデータは使用されない。そのため、フォーム送信に対するＰＦは、修正と追加とを区別することができる。ＰＦのフォームは、定義された型の任意の数の入力要素と共に任意のフォームのフォーム送信をハンドリング可能である。
【００５９】
サーチページは、サーチ条件としての１つまたは複数のデータ入力要素、および、サーチ結果を表示するための２次元データグリッドを包含する。データグリッドのそれぞれの列は命名可能である。データサーチの送信について、バックエンドに送られるＪＳＯＮデータメッセージは、２つの部分、つまり、以下に示されるような空の２次元配列部分のサーチ条件部分およびデータグリッド部分を有する。
{
{“input”:{
{“name1”: “value1”},
{“name2”: {
{“Max”: {“value”: “v2”, “EQUAL”: “true”}}, 
{“Min”: {“value”: “v3”, “EQUAL”: “false”}}
} },
…      
},
{“output”: {
[[{name4:0}, {name5:0},…]]
}}
}
ここで、ｎａｍｅ２は範囲値入力を指定し、ＥＱＵＡＬは、ｔｒｕｅが＜＝ｐｒ＞＝を意味し、ｆａｌｓｅが＜ｏｒ＞を意味する。
【００６０】
サーチ条件部分は、命名されかつマーキングされた型とすることができ、ＡＤＤのフォームと同じようにパッケージングされる。
【００６１】
バックエンドの１つの実施形態は、データ記憶域としてリレーショナルデータベースを選定することであり、データメッセージの間で送受信されるデータメッセージはＪＳＯＮフォーマットである。リレーショナルデータベースと相互作用する必要があるＰＦについて、データベーススキーマ名が使用される必要がある。データベーススキーマ名に対応するデータメッセージにおける名前を機能させるために、これらの名前はデータベーススキーマ名に変換される。テーブルの列名はｔａｂｌｅＮａｍｅ．ｃｏｌｕｍｎＮａｍｅのフォームである。単一のテーブルにおける挿入をハンドリングするＰＦは、以下のようにＣＧＤＭによって実装可能である。
{“input”: {
{“column1”: “table1.column1”},
{“column2”: “table1.Column2” },
{“column3”, “table1.Column3” },
…
} }
【００６２】
１つのテーブルに挿入するために、それぞれの列はＳＱＬ挿入ステートメントによって同じように扱われるため、１つの型のデータがある。かかる挿入をハンドリングするＣＧＤＭは以下になる。
{ input: {
{“table1.column1”, “”},
{ “table1.Column2”, “” },
{ “table1.Column3”, “” },
…
}}
【００６３】
マスター／詳細テーブルに挿入するために、ＣＧＤＭは以下になる。
{“input”: {
{“Master”: {
{ “table1.column1”: “”},            
{ “table1.Column2”:“”},      
{ “table1.Column3”: “”}      
…
}}
{ “Detail”: {
[{“table2.column1”: “”},
{ “table2.Column2”: “” },
{ “table2.Column3”: “” },…] }}
}}
ここで、ＣＧＤＭは、マスターテーブルのデータ、および、詳細テーブルのデータの配列を含む。
【００６４】
１つのテーブルへの更新をハンドリングするＰＦは以下のようにＣＧＤＭを有する。
{“input”: {
“primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“values”: {
{ “table1.Column3”: “” },
{ “table1.Column4”: “”},
…
}}
}
【００６５】
マスター／詳細テーブルへの更新をハンドリングするＰＦは以下のようにＣＧＤＭを有する。
{“input”:{{“m_Primarykey”: {
{ “table1.column1”: “”},
{ “table1.Column2”: “”},
…
}
},
{“m_values”: {
{ “table1.Column3”: “”},
{ “table1.Column4”: “”},
…
}
},
{“d_Primarykey”: {
{ “table2.column1”: “”},
{ “table2.Column2”: “”}
…
}
},
{“d_values”: {
{ “table2.column3”: “”},
{ “table2.Column4”: “”}
…
}
},
{“d_data”: {
[{“table2.column1”: “”},{ “table2.Column2”: “”},…, 
{ “table2.Column3”: “”},{ “table2.Column3”: “”}…]
}
}}      
}
【００６６】
以下の例について、ＳＱＬ選択ステートメントが、［Ｆ：順序セクション］による［Ｅ：アグリゲーション条件］順序を有する［Ｄ：アグリゲーションセクション］によって［Ｃ：条件セクション］がグループ分けする場合の［Ｂ：テーブルセクション］からの［Ａ：出力セクション］の選択などのフォームを取ると仮定する。この入力および出力に対するデータは６つのセクションに分割される。セクションＡが、セクションＢに現れるテーブルの列またはセクションＢに現れるテーブルの列に対するＳＱＬ関数を包含し、セクションＢがテーブルおよび結合関係を包含し、セクションＣが、同じ関係における、ｃｏｌｕｍｎ＝ｖａｌｕｅ  ｏｒ  ｃｏｌｕｍｎ＞（＝）ｖａｌｕｅ  ｏｒ  ｃｏｌｕｍｎ＜（＝）ｖａｌｕｅ、ｃｏｌｕｍｎ  ＬＩＫＥ  ｖａｌｕｅ  ＳＱＬＦｕｎｃｔｉｏｎ（ｃｏｌｕｍｎ）のフォームの条件を包含し、セクションＥがＳＱＬＡｇｇｒｅｇａｔｅＦｕｎｃｔｉｏｎ（ｃｏｌｕｍｎ）＝ｏｒ＜（＝）ｏｒ＞（＝）ｖａｌｕｅｓを包含し、セクションＦが列を包含すると仮定する。
【００６７】
セクションＢにおいて必要とされるテーブルおよびそれらの結合関係情報は、データベースのスキーマから取得可能であるが、結合型情報はアプリケーションから生じるものとする。この選択ステートメントを実装するＰＦのＣＧＤＭにおける２つのテーブルの間の関係を表すための配列構造が選定できる。この選択ステートメントのＣＧＤＭは以下になる。
{{“input”:
{{“requirement”: {
[{ “tableA.column8”: “tableA.column8”},
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
},
…]}
},
{“table”: {
{[ “tableA”, “tableB”, “joinType”, “tableA.column1= tableB.column2”, “tableA.column3= tableB.column4”, …],
[ “tableC”, “tableD”, “joinType”, “tableC.column1= tableD.column2”, “tableC.column3= tableD.column4”, …],
…}}
},
{“condition”: {
{ “tableA.column5”: “v1”},      //default to tableA.column5=v1
{ “tableB.column1”: {
“value”: “v2”,            //default to SUM(tableB.column1)=v2
“FUNC”: “SUM”
}
},
…}
},
{“groupby”: [
“tableA.column6”,
{ “tableB.column2”: {
“FUNC”: “DATE”
}
},
…]
},
{“having”: {            
{ “tableB.column3”: {
“value”: “v3”,
“FUNC”: “MAX”
}
},
…}
},
{“orderby”: [
“tableA.column7”,
…]
}
}},
{“output”: 
{“results”: 
[{ “tableA.column8”: ‘’},
{ “total1”: ‘’},
…]}
}}
【００６８】
入力要件は、ＳＱＬ選択のセクションＡに対応しており、かつ、ＳＱＬ選択の出力を指定する。該要件は、配列フォーマットを指定する。｛“ｔａｂｌｅＡ．ｃｏｌｕｍｎ８”：“ｔａｂｌｅＡ．ｃｏｌｕｍｎ８”｝は、ｔａｂｌｅＡ．ｃｏｌｕｍｎ８の値を得ること、および「ｔａｂｌｅＡ．ｃｏｌｕｍｎ８」という名前に設定することを意味する。ペアの、
{ “total1”: { “tableB.column4”:
{
“FUNC”: “SUM”
}}
}
は、ＳＵＭ関数列、ｔａｂｌｅＢ．ｃｏｌｕｍｎ４を適用し、かつ、値を「ｔｏｔａｌ１」という名前に適用することを意味する。
【００６９】
２つ以上のＰＦを使用してバックエンド計算タスクを達成する実装について、図１０に示されるように、販売注文の出荷を演算する場合を検討する。販売注文は、（部分払いまたは在庫品の制約のため）一部出荷可能であると仮定すると、販売注文は２回以上出荷される必要がある場合がある。着信するＣＧＤＭは以下になる。
{ “Order_Shipment_Data” : 
{“input”: {
{“orderID”, “value1”}
}},
{“output”: {
{“order_info”: {
{“orderCode”:””}
{“salesmanName”:””},
{“customerName”:””}
}},
{“order_prod_info”: {
[[{“productName”:””}, {“productionDate”:””},
{“Quantity”:””},{“shippedQuantity”:””},{“quantityLeft”:””}]]
}}
}}
}
【００７０】
入力は注文ｉｄであり、必要とされる出力は、いくつかの注文情報、注文コード、販売員名およびカスタマ名、ならびに、製品情報、製品名、製造日、注文量、出荷量、および出荷される残りの量のリストを含む。
【００７１】
図１０では、ＣＧＤＭは、ＤａｔａＥｘｐａｎｄｅｒ  ＰＦ１０によって受信される。ＤａｔａＥｘｐａｎｄｅｒ  ＰＦ１０は、リレーショナルデータセット１２に接続する。ＣＧＤＭのためにＷＮＳＭ１００をマッピングする、機能させる名前空間は、以下になる。
{
{“orderID”, “order.id”};
{ “orderCode”, “order.code”}
{ “salesmanName”, “employee.name” }
{“customerName”, “customer.name”}
{“productName”, “product.name”}
{“productionDate”, “product.productionDate”}
{ “Quantity”, “order.Quantity” }
}
【００７２】
マッピング後、ＣＧＤＭは以下になる。
{ “Order_Shipment_Data” : 
{“input”: 
{“order.id”, “value1”}
},
{“output”: {
{“order_info”: {
{“order.code”: “”}
{“employee.name”: “”},
{“customer.name”: “”}
}},
{“order_prod_info”: {
[[{“product.name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]
}}
}}
}
【００７３】
ＰＦ１０は、ＳｅｌｅｃｔおよびＰａｃｋｅｒという２つのＣＦを有する。Ｓｅｌｅｃｔ  ＣＦは、３つのインスタンス、１０２、１０４、および１０６を作動させる。Ｐａｃｋｅｒ  ＣＦは１つのインスタンス１０８を作動させる。Ｓｅｌｅｃｔは、リレーショナルデータベースに対して上の例の型ＳＱＬ選択を行い、Ｐａｃｋｅｒ  ＣＦは、この入力全てを、データメッセージ（例えば、ＣＧＤＭ）の対応する入力部分および出力部分にパッケージングし、データメッセージをＬｏｏｐＰＦ１４に送る。ＰＦ１４は、入力として配列ＡおよびＢを取る１つのインスタンスを作動させる、ＫｅｙＭａｔｃｈＬｏｏｐと呼ばれる１つのＣＦを有し、配列Ｃを出力する。Ａ、Ｂ、およびＣにおけるそれぞれの要素は、キー部分および値部分を有する。要素のキーは、名前／値のシーケンスである。２つのキーは、２つのキーの名前値シーケンスの長さが同じである場合同じ型であり、シーケンスのそれぞれの位置の２つの名前／値ペアについて、名前は同じである。２つのキーは、同じ型を有しかつ対応する名前の値が等しい場合、等しい。ＡおよびＢは同じ型のキーを有する。ＫｅｙＭａｔｃｈＬｏｏｐのアルゴリズムは以下になる。
For each element a of A 
Create an element c with key part same as a
if there is an element b of B with a.key==b.key {
value part of c is computed from value parts of a 
and b by computation rule1.
}
else {
value part of c is computed from value parts of a 
and b by computation rule2.
}
add c to
【００７４】
計算規則１および計算規則２は、Ｃａｌｃｕｌａｔｏｒ  ＰＦ１６によって行われる。ＰＦ１６は、３つの計算、Ｅｑｕａｌ、Ｚｅｒｏ、およびＭｉｎｕｓを有する。ＰＦ１０に対するＯｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿ＤａｔａのＣＧＤＭは以下になる。
{“Order_Shipment”: 
{“Select.order”:  
{
{ “input”: {
{ “requirement”: {
{“order.code”: “order.code”}
{“salesman.name”: “salesman.name”},
{“customer.name”: “customer.name”}
}},
{ “condition” : {
{“order.id”, “Order_Shipment_Data.input.‘order.id’” }
}}, 
{ “table” : {
{[“order”, “salesman”, “inner join”, “order.salesmanID=salesman.id”],
[“order”, “customer”, “inner join”, “order.customerID=customer.id”]}
}}
}},
{ “output”: 
{ “result”: “Order_Shipment_Data.output.order_info”}
}}      
}},
{“Select.orderProduct”:  
{
{ “input”: {
{ “requirement”: {
[{“product.name”: “product.name”}, 
{“production.date”: “production.date”},
{“order_product.quantity”: “order_product.quantity”}]
}},
{ “condition” : {
{“order_product.orderId”, 
“Order_Shipment_Data.input.‘order.id’” }
}}, 
{ “table” : {
[“order_product”, “product”, “inner join”, 
“order_product.productId=production.id”]
}}
}},
{ “output”: { 
“result”: “”}
}}      
}}
{“Select.shipped”: 
{
{ “input”: {
{ “requirement”: {
{“product.name”: “product.name”}, 
{“production.date”:“production.date”},
{“shippedQuantity”: {“shipment.Quantity”:
{
“FUNC”: “SUM”
}}
}
}},
{ “condition” : {
{“shipment.orderid”,“Order_Shipment_Data.input.‘order.id’” }
}}, 
{ “table” : {
[“shipment”, “product”, “inner join”, “shipment.productID=product.id”]
}}
{ “aggregate” : {
[“product.name”, “product.productiondate”]
}}
}},
{ “output”: 
{ “result”: “”}
}
}}
{“packer”: {
{“input”: {
{“In”: 
{      
{“A”: “Select.orderProduct.output.Result”},
{“B”: “Select.shipped.output.Result”}
}},
{“Out”: {{“C”: “Order_Shipment_Data.output.order_prod_info”}}}
}},
{“output”: {
{“result” : “Order_Shipment_Data.output.order_prod_info”}
}}
}}
}
【００７５】
データメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの出力部分のｏｒｄｅｒ＿ｐｒｏｄ＿ｉｎｆｏは、ＰＦ１０がＰＦ１４に送るデータメッセージの出力部分を生成するための入力として使用される。ＰＦ１０は、データメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａ＿ＦｕｌｌをＰＦ１４に送る。
{“Order_Shipment_Data_Full”: {
{“input”: {
{“A”: [[{“product.name”: “v1”}, {“product.productionDate”: “v2”},
{“order_product.quantity”: “v3”}]]},
{“B”: [[{“product.Name”: “v4”}, {“product.productionDate”: “v5”},
{“shippedQuantity”: “v6”}]]}      
}},
{“output”: {
{“C”: [[{“product.Name”: “”}, {“product.productionDate”: “”},
{“order.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}]]}
}}
}      
}
【００７６】
ＰＦ１４に対するデータメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａ＿ＦｕｌｌのＣＧＤＭは以下になる。
{“Loop”:{
{“input”: {
{“A”:
[“Order_Shipment_Data_full.Input.A”, 
{“key”:[“product.name”, “product.productionDate”]}, 
{“value”:{{“shippedQuantity” } }]
},
{“B”:
[“Order_Shipment_Data_full.Input.B”, 
{“key”:[“product.name”, “product.productionDate”]}, 
{“value”:{{“order_product.quantity”} }]      
},
{ “C”: 
[“Order_Shipment_Data_full.output.C”, 
{“key”:[“product.name”, “product.productionDate”]}, 
{“value”:{{“order_product.quantity”},{“shippedQuantity”},{“quantityLeft”}}]
}
}},
{“output”: 
{ “result”: “Order_Shipment_Data_full.output.C”}
}
}
}
【００７７】
ＰＦ１４はＰＦ１６に２つのデータメッセージを送る。
{“Order_data”: {
{“input”: {
{“A”:{“order_product.quantity”: “v1”}}
}},
{“output”: {
{“C”:{{“order_product.Quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}      
}
{“Order_Ship_data”: {
{“input”: {
{“A”: {“order_product.quantity”: “v1”}},
{“B”: {“shippedQuantity”: “v2”}}      
}
{“output”: {
{“C”: {{“order_product.quantity”: “”},{“shippedQuantity”: “”},{“quantityLeft”: “”}}}
}}
}      
}
【００７８】
Ｏｒｄｅｒ＿Ｓｈｉｐ＿ｄａｔａについてのＣＧＤＭは以下になる。
{“Order_Ship_Data”: {
{“Equal.quantity”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”:  {
“Y”: “C.order_product.quantity”            //Y=X
}}
}
},
{“Equal.quantityLeft”: {
{“input”: {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”:“C.quantityLeft”
}}
}
}
{“Zero”: {
{“output”: {
“X”:“C.shippedQuantity”            //X=0
}}
}
}      
}}
【００７９】
Ｏｒｄｅｒ＿ｄａｔａについてのＣＧＤＭは以下になる。
{“Order_Data”: {
{“Equal.quantity”: {
{“input”:  {
“X”:“A.order_product.quantity”
}},
{“output”: {
“Y”: “C.order_product.quantity”       
}}
}
},
{“Equal.shippedQuantity”: {
{“input”: {
“X”:“B.shippedQuantity”
}},
{“output”: {
“Y”:“C.shippedQuantity”            
}}
}
},
{“Minus”: {
{“input”: {
{“X”:“A.order_product.quantity”},
{“Y”:“B.shippedQuantity”}
}},
{“output”: {
“Z”:“C.quantityLeft”      //Z=X-Y
}}
}
}      
}}
【００８０】
データメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの出力部分は、ＣＦインスタンス１０６およびＣＦインスタンス１０８の出力部分によって形成される。そして、着信するデータメッセージ、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの機能させる名前空間に逆にマッピングでき、Ｏｒｄｅｒ＿Ｓｈｉｐｍｅｎｔ＿Ｄａｔａの送信者に送ることができる。
【００８１】
本発明の例示の実施形態は、ＣＧＤＭのマークアップおよびプロパティシートを利用する。この実施形態は線形カスケードに関して以下に論じられるが、本発明はデータのいずれの特定の編成にも限定されない。線形カスケードは＜ｓｅｌｅｃｔ＞要素のリストであり、これは、第１の要素から始まって最終の要素を除いたものであり、１つの＜ｓｅｌｅｃｔ＞要素の選択された値が該リストにおける次の＜ｓｅｌｅｃｔ＞のオプションを判断する。
【００８２】
線形カスケード入力の１つの例はＣｏｕｎｔｒｙ−Ｓｔａｔｅ−Ｃｉｔｙ入力であり、これによって、ユーザはＣｏｕｎｔｒｙのオプションから国を選択でき、Ｓｔａｔｅのオプションを判断し、ユーザはＳｔａｔｅのオプションから州を選択でき、Ｃｉｔｙのオプションを判断する。ブラウザの実装形態において、Ｃｏｕｎｔｙ、Ｓｔａｔｅ、およびＣｉｔｙはそれぞれ、＜ｓｅｌｅｃｔ＞要素によって表される。Ｃｏｕｎｔｒｙに対するイベントハンドラはＣｏｕｎｔｙ＜ｓｅｌｅｃｔ＞要素にアタッチされ、Ｓｔａｔｅに対するイベントハンドラはＳｔａｔｅ＜ｓｅｌｅｃｔ＞要素にアタッチされる。例えば、「米国」などの国が選択される時、Ｃｏｕｎｔｒｙのイベントハンドラは呼び出され、このイベントハンドラは「米国」の値を得て、｛Ｃｏｕｎｔｒｙ＝“ＵＳＡ”、Ｓｔａｔｅ［］｝のメッセージを作成し、このメッセージをバックエンドプロセスに送って「米国」の全ての州を得て、Ｓｔａｔｅ［］における値を記憶する。Ｓｔａｔｅ［］の値は次いで、Ｓｔａｔｅを表す＜ｓｅｌｅｃｔ＞に設定される。ＳｔａｔｅおよびＣｉｔｙに対するイベントハンドラは同様である。
【００８３】
本発明の一実施形態では、カスケードはリストとしてデータ構造によって表され、この場合、リストのそれぞれの要素は５つのメンバ、すなわち、ＩＤ、Ｎｅｘｔ、ＳｅｌｅｃｔｅｄＶａｌｕｅ、ｅｖｅｎｔＨａｎｄｌｅｒ、およびＯｐｔｉｏｎｓを有する。ＩＤは要素の名前を保持し、Ｎｅｘｔはリストの次の要素のＮａｍｅの値を有し、ＳｅｌｅｃｔｅｄＶａｌｕｅは選択された値を保持し、ｅｖｅｎｔＨａｎｄｌｅｒは要素のイベントハンドラ関数を保持し、Ｏｐｔｉｏｎｓは値のセットを保持する。Ｏｐｔｉｏｎｓから値を選択し、かつＳｅｌｅｃｔｅｄＶａｌｕｅを設定するアクションは、リストの要素に対して行われ得る。アクションを終えると、ｅｖｅｎｔＨａｎｄｌｅｒにおける関数は引数として要素を渡すことによって呼び出される。
【００８４】
ＩＤは任意の名前を取ることができるため、アルゴリズムは抽象的である。これらは、Ｃｏｕｎｔｒｙ、Ｓｔａｔｅ、Ｃｉｔｙ、またはＣｏｍｐａｎｙ、Ｄｅｐａｒｔｍｅｎｔ、Ｅｍｐｌｏｙｅｅ  Ｎａｍｅ、またはＣａｔｅｇｏｒｙ、Ｔｙｐｅ、Ｐｒｏｄｕｃｔ  Ｎａｍｅとすることができる。アルゴリズムは、任意の数の要素が可能とされるため、一般化される。
【００８５】
次に、リスト構造はＨＴＭＬ上でマーキングされる。ＩＤおよびＮｅｘｔを除いて、＜ｓｅｌｅｃｔ＞要素は他全てを有する。ここでのＣＧＤＭの定義において、それぞれの値は名前を有するものとするため、ＣＧＤＭ上では、Ｎｅｘｔのみが必要とされる。値の名前が、ＩＤプロパティをＨＴＭＬタグの全ての要素に加えることによって実装されると仮定する。
【００８６】
カスケードのマークアップ規則は、それぞれの＜ｓｅｌｅｃｔ＞要素に対してＮｅｘｔプロパティを加えるためのものであり、この値はカスケードにおける次の＜ｓｅｌｅｃｔ＞のＩＤの値である。１つのＨＴＭＬページにおける２つ以上のカスケードが可能である。
【００８７】
一般に、マークアップ規則は、アルゴリズムの任意の入力インスタンスに対して、これに対応する拡張コンテンツがあり、かつ、入力インスタンスおよびこの全データ特徴が拡張コンテンツから演繹できるように、ＣＧＤＭの横文規則を使用してＣＧＤＭのコンテンツを拡張するための規則として定義される。マークアップ規則はアルゴリズムに関連付けられる。
【００８８】
ＰＦ関数は、異なるカスケードにおいてさえも、全ての＜ｓｅｌｅｃｔ＞要素に対する選択イベントのイベントハンドラであってよい。この例では、ＰＦにはｃａｓｃａｄｅＰＦという名前が与えられる。ｃａｓｃａｄｅＰＦの入力は、選択された値、およびイベントを生成する＜ｓｅｌｅｃｔ＞要素である。ＨＴＭＬ全体のドキュメントオブジェクトモデル（ＤＯＭ）構造はまた、ｃａｓｃａｄｅＰＦにアクセス可能である。ＰＦのＣＧＤＭは、ＣＧＤＭ＝｛｛ｔｈｅ  ｓｅｌｅｃｔｅｄ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ｝、ＤＯＭ｝と見なすことができ、入力部分は、｛｛ｔｈｅ  ｓｅｌｅｃｔｅｄ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ｝、｛Ａｌｌ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ  ｏｆ  ｔｈｅ  ｃａｓｃａｄｅ｝｝であり、出力部分は、｛｛ｔｈｅ  ｎｅｘｔ  ｅｌｅｍｅｎｔ  ｏｆ  ｔｈｅ  ｓｅｌｅｃｔｅｄ  ＜ｓｅｌｅｃｔ＞  ｅｌｅｍｅｎｔ｝｝である。
【００８９】
全てのカスケードは、種々のＨＴＭＬページにおいてさえも、同じｃａｓｃａｄｅＰＦを使用し、また、同じＣＧＤＭ名を使用できるため、ｃａｓｃａｄｅＰＦのＶＭＳＳストアはいずれのルックアップに対しても１つのＶＭＳＳを返すように構成可能である。ｃａｓｃａｄｅＰＦの例示のＣＦ関数は、ｉｎｉｔＲｅｓｔＥｌｅｍｅｎｔ（ＣｕｒｒｅｎｔＥｌｅｍｅｎｔＮａｍｅ名）であり、これは、ＩＤ＝ｎａｍｅの現在の要素について、次の要素から最後の要素まで全てに対するオプションを再設定し、Ｒｅｓｕｌｔｓ  ｒ＝ｇｅｔＶａｌｕｅｓＦｒｏｍＢａｃｋｅｎｄ（Ｃｏｎｄｉｔｉｏｎ  ｃｏｎｄｉｔｉｏｎ、Ｒｅｓｕｌｔｓ  ｒ、ＢａｃｋｅｎｄＰｒｏｃ  ｐ、ＣＧＤＭＮａｍｅｐＣＧＤＭＮａｍｅ）、これは、ＣＧＤＭをパッケージングし、バックエンドプロセスｐを呼び出し、ｐＣＧＤＭＮａｍｅという名前のＣＧＤＭを渡し、ｓｅｔＯｐｔｉｏｎ（Ｒｅｓｕｌｔｓ  ｒ）とする、つまり、ＩＤ＝ｒ．ｎａｍｅの＜ｓｅｌｅｃｔ＞のオプションを設定する。ＣＧＤＭは次のフォーマットを有する。
{pCGDMName: {      
{Input: {Condition:{name:value}}}, {Output:{Results:{r:NULL}}
}
【００９０】
ｃａｓｃａｄｅＰＦは＜ｓｅｌｅｃｔ＞要素全てに対して使用できるため、ＰＦが受信する、選択された＜ｓｅｌｅｃｔ＞要素は、異なる＜ｓｅｌｅｃｔ＞要素に対して選択が行われる時、異なる。そのため、直接可変マッピング（ＶＭ）は不可能である。しかしながら、ＣＦの引数はマークアップおよびＣＧＤＭから演繹可能である。これを規則ベースのＶＭ（ＲＢＶＭ）と呼ぶ。
【００９１】
バックエンドにおいて、ｈａｎｄｌｅＤＢＳｅｌｅｔｉｏｎと呼ばれるＰＦを有することができ、これは、設定されたＳＱＬ選択実装形態を包含する。通常、＜ｓｅｌｅｃｔ＞に対するオプションの値は、ＳＱＬ選択を作動させることによって取得可能である。ｃａｓｃａｄｅＯｐｔｉｏｎｓＣＧＤＭをＣＧＤＭの名前として割り当て、ｇｅｔＶａｌｕｅｓＦｒｏｍＢａｃｋｅｎｄはｈａｎｄｌｅＤＢＳｅｌｅｃｔｉｏｎに渡される。
【００９２】
ＲＢＶＭを使用して、ＰＦに対するＶＭＳＳは以下になる。
{initRestElement: RBVM}
{getValuesFromBackend: {{condition: RBVM }, {r : RBVM }, {p: handleDBSelection },{pCGDMName: cascadeOptionsCGDM }}}
{ setOptions: { {r: getValuesFromBackend.r}}
【００９３】
ＣＦの呼び出し元は以下になる。
initRestElementCaller(RBVM, CGDM, CFResults)
{
name = get the ID’s value of the selected <select> element
initRestElement(name);
}
getValuesFromBackendCaller(RBVM, CGDM, CFResults)
{
(name, value) = get the ID’s value and the selected value of the selected 
<select> element
name = get the ID’s value of the next element of the selected <select> element
r = getValuesFromBackend(value, name, handleDBSelection, cascadeOptionsCGDM);
add r to CFResults.
}
setOptionsCaller(RBVM, CGDM, CFResults)
{
r = get getValuesFromBackend.r from CFResults
setOptions(r);
}
【００９４】
ＲＢＶＭの利点は、新しいカスケードが加えられる時、またはカスケードの長さが延長される時、コードの規則処理部分が変更されないことである。選定したアルゴリズムが抽象的でありかつ一般化されるため、全てのカスケードは同じコードを使用できる。
【００９５】
ＣＦＣａｌｌｅｒｓの実装形態は、マークアップ規則による影響を受ける。ＣＦの新しいＣＦＣａｌｌｅｒはマークアップ規則に対して開発される必要がある。マークアップ規則に起因して、ＣＦは２つ以上のＣＦＣａｌｌｅｒを有することができる。
【００９６】
全てのＣＦは、純粋なアルゴリズム関数であり、これらは純粋なカスケードを実装し、Ｃｏｕｎｔｒｙ−Ｓｔａｔｅ−ＣｏｕｎｔｙまたはＧｒａｄｅ−Ｃｌａｓｓ−ＳｔｕｄｅｎｔＮａｍｅのどちらかであるカスケードに割り当てられるアプリケーションの意味に関係ない。
【００９７】
マークアップは、相互参照としてＣＧＤＭの値の名前を使用して、等しいまたはより表現的な横文規則を有する別個のメッセージに対して行われ得る。別個のマークアップメッセージを、ＣＧＤＭのプロパティシート（ＰＳ）と呼ぶ。いずれのＣＧＤＭもこれにアタッチするＰＳを有することができる。開発時間において、ＣＧＤＭの名前インスタンス（ＮＩ）が既知であるため、ＰＳは開発時間にＣＧＤＭにアタッチできる。
【００９８】
本発明の例示の実施形態を説明したが、本発明は、開示された実施形態に限定されず、本開示の趣旨および範囲内に含まれるさまざまな修正および等価の配置構成に及ぶことが意図されることは、理解されたい。
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
サービスを行うためにコンピュータプログラムにおける処理方法であって、
前記サービスの入力／出力（Ｉ／Ｏ）要件を複数のＩ／Ｏキー／値ペアを含む対応するデータメッセージに変換することと、
入力引数として前記データメッセージを受信するように前記プログラムの部分関数（ＰＦ）を構成することと、
計算関数（ＣＦ）の引数に、かつ前記Ｉ／Ｏキー／値ペアにマッピングするキーペアを含む可変マッチング構造（ＶＭＳ）セット（ＶＭＳＳ）を生成することと、
前記ＶＭＳＳを使用して前記計算関数（ＣＦ）を呼び出すように前記ＰＦを構成することであって、前記ＣＦは前記サービスに関連している演算を行うように構成される、構成することと、を含む、方法。
【請求項２】
前記ＶＭＳＳは前記キーペアのサブセットを含むＶＭＳを含み、前記サブセットの前記キーペアの中の第１のキーペアは、前記ＣＦの入力引数にマッピングする第１のキー、および、前記Ｉ／Ｏキー値ペアの中の入力キー／値ペアにマッピングする第２のキーを含む、請求項１に記載の方法。
【請求項３】
前記サブセットの前記キーペアの中の第２のキーペアは、前記ＣＦの出力引数にマッピングする第３のキー、および、前記Ｉ／Ｏキー値ペアの中の出力キー／値ペアにマッピングする第４のキーを含む、請求項２に記載の方法。
【請求項４】
前記データメッセージの名前によって索引付け可能であるデータ記憶域に前記ＶＭＳＳを記憶することをさらに含む、請求項１に記載の方法。
【請求項５】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項１に記載の方法。
【請求項６】
サービスを行うように構成されるコンピュータプログラムを実行する方法であって、前記コンピュータプログラムは、入力引数として複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含むデータメッセージを受信するように構成される部分関数（ＰＦ）を含み、前記方法は、
前記データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造（ＶＭＳ）を含む、検索することと、
検索された前記データ構造におけるそれぞれの要素について、
前記要素の前記名前を使用して計算関数（ＣＦ）を検索し、かつ
前記要素の前記ＶＭＳおよび前記データメッセージを使用して検索された前記ＣＦを呼び出すことと、を含む、方法。
【請求項７】
前記呼び出すことは、前記データメッセージから入力データを判断することと、前記ＶＭＳから前記入力データのデータ部分に前記ＣＦの引数をマッピングすることと、前記マッピングに従って前記データ部分によって前記ＣＦを呼び出すことと、を含む、請求項６に記載の方法。
【請求項８】
前記呼び出すことは、前記検索されたＣＦの以前の呼び出しの結果を含む前記ＰＦの内部データ構造に記憶されるデータをさらに使用する、請求項６に記載の方法。
【請求項９】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項６に記載の方法。
【請求項１０】
前記呼び出すことは、第２のＰＦを起動するために複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含む第２のデータメッセージによって前記検索されたＣＦを呼び出す、請求項６に記載の方法。
【請求項１１】
サービスを行うためのコンピュータプログラム製品であって、プログラム命令が具現化されるコンピュータ可読記憶媒体を備え、前記プログラム命令は、
前記サービスの入力／出力（Ｉ／Ｏ）要件を複数のＩ／Ｏキー／値ペアを含む対応するデータメッセージに変換することと、
入力引数として前記データメッセージを受信するように前記プログラムの部分関数（ＰＦ）を構成することと、
計算関数（ＣＦ）の引数に、かつ前記Ｉ／Ｏキー／値ペアにマッピングするキーペアを含む可変マッチング構造（ＶＭＳ）セット（ＶＭＳＳ）を生成することと、
前記ＶＭＳＳを使用して前記計算関数（ＣＦ）を呼び出すように前記ＰＦを構成することであって、前記ＣＦは前記サービスに関連している演算を行うように構成される、構成することと、を含む方法を行うようにコンピュータによって実行可能である、コンピュータプログラム製品。
【請求項１２】
前記ＶＭＳＳは前記キーペアのサブセットを含むＶＭＳを含み、前記サブセットの前記キーペアの中の第１のキーペアは、前記ＣＦの入力引数にマッピングする第１のキー、および、前記Ｉ／Ｏキー値ペアの中の入力キー／値ペアにマッピングする第２のキーを含む、請求項１１に記載のコンピュータプログラム製品。
【請求項１３】
前記サブセットの前記キーペアの中の第２のキーペアは、前記ＣＦの出力引数にマッピングする第３のキー、および、前記Ｉ／Ｏキー値ペアの中の出力キー／値ペアにマッピングする第４のキーを含む、請求項１２に記載のコンピュータプログラム製品。
【請求項１４】
前記データメッセージの名前によって索引付け可能であるデータ記憶域に前記ＶＭＳＳを記憶することをさらに含む、請求項１１に記載のコンピュータプログラム製品。
【請求項１５】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項１１に記載のコンピュータプログラム製品。
【請求項１６】
サービスを行うように構成されるコンピュータプログラムを実行するコンピュータプログラム製品であって、前記コンピュータプログラムは、入力引数として複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含むデータメッセージを受信するように構成される部分関数（ＰＦ）を含み、前記コンピュータプログラム製品は、プログラム命令が具現化されるコンピュータ可読記憶媒体を備え、前記プログラム命令は、
前記データメッセージの名前を使用して複数の要素を含むデータ構造を検索することであって、それぞれの要素は名前および可変マッチング構造（ＶＭＳ）を含む、検索することと、
検索された前記データ構造におけるそれぞれの要素について、
前記要素の名前を使用して計算関数（ＣＦ）を検索し、かつ
前記要素の前記ＶＭＳおよび前記データメッセージを使用して検索された前記ＣＦを呼び出すことと、を含む方法を行うようにコンピュータによって実行可能である、コンピュータプログラム製品。
【請求項１７】
前記呼び出すことは、前記データメッセージから入力データを判断することと、前記ＶＭＳから前記入力データのデータ部分に前記ＣＦの引数をマッピングすることと、前記マッピングに従って前記データ部分によって前記ＣＦを呼び出すことと、を含む、請求項１６に記載のコンピュータプログラム製品。
【請求項１８】
前記呼び出すことは、前記検索されたＣＦの以前の呼び出しの結果を含む前記ＰＦの内部データ構造に記憶されるデータをさらに使用する、請求項１６に記載のコンピュータプログラム製品。
【請求項１９】
前記データメッセージはＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ（ＪＳＯＮ）フォーマットを有する、請求項１６に記載のコンピュータプログラム製品。
【請求項２０】
前記呼び出すことは、第２のＰＦを起動するために複数の入力／出力（Ｉ／Ｏ）キー／値ペアを含む第２のデータメッセージによって前記検索されたＣＦを呼び出す、請求項１６に記載のコンピュータプログラム製品。
【国際調査報告】
2018521438.tif 000013