@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/ada-generic-programming/#article>
    schema:about <https://comcomponent.com/knowledge/ada-generics/>, <https://comcomponent.com/knowledge/ada-generic-contract-model/> ;
    schema:mentions <https://comcomponent.com/knowledge/ada/>, <https://comcomponent.com/knowledge/gnat/>, <https://comcomponent.com/knowledge/alire/>, <https://comcomponent.com/knowledge/cpp-templates/>, <https://comcomponent.com/knowledge/ada-generic-subprogram/>, <https://comcomponent.com/knowledge/ada-generic-package/>, <https://comcomponent.com/knowledge/ada-generic-formal-type/>, <https://comcomponent.com/knowledge/ada-generic-formal-subprogram/>, <https://comcomponent.com/knowledge/ada-generic-formal-package/>, <https://comcomponent.com/knowledge/ada-generic-formal-object/>, <https://comcomponent.com/knowledge/ada-generic-instantiation/>, <https://comcomponent.com/knowledge/late-instantiation-error/> .

<https://comcomponent.com/knowledge/ada-generics/> a skos:Concept ;
    skos:prefLabel "Adaのジェネリック(総称単位)"@ja ;
    skos:definition "型・値・サブプログラム・パッケージを仮パラメータとして受け取り、newによるインスタンス化の時点で静的に型チェックされるAdaの再利用機構。"@ja ;
    skos:altLabel "generic unit" ;
    skos:altLabel "総称単位"@ja ;
    ks:uses <https://comcomponent.com/knowledge/ada-generic-subprogram/> ;
    ks:uses <https://comcomponent.com/knowledge/ada-generic-package/> ;
    ks:uses <https://comcomponent.com/knowledge/ada-generic-formal-subprogram/> ;
    ks:uses <https://comcomponent.com/knowledge/ada-generic-formal-package/> ;
    ks:requires <https://comcomponent.com/knowledge/ada-generic-instantiation/> .

<https://comcomponent.com/knowledge/ada-generic-contract-model/> a skos:Concept ;
    skos:prefLabel "Adaジェネリックのcontract model"@ja ;
    skos:definition "ジェネリック本体を仮パラメータが約束した操作だけで書かせ、本体単独で型チェックするAdaジェネリックの設計方式。"@ja ;
    skos:altLabel "contract model" ;
    ks:prevents <https://comcomponent.com/knowledge/late-instantiation-error/> .

<https://comcomponent.com/knowledge/ada/> a skos:Concept ;
    skos:prefLabel "Ada(プログラミング言語)"@ja ;
    skos:definition "1970年代後半にアメリカ国防総省の主導で標準化された、強い型付けと高信頼性を重視する汎用プログラミング言語。最新標準はAda 2022。"@ja ;
    skos:altLabel "Ada言語"@ja ;
    skos:altLabel "Ada 2022" ;
    ks:implements <https://comcomponent.com/knowledge/ada-generics/> .

<https://comcomponent.com/knowledge/ada-generic-subprogram/> a skos:Concept ;
    skos:prefLabel "総称サブプログラム(Generic Subprogram)"@ja ;
    skos:definition "generic宣言に続けて書くサブプログラムの雛形。具体的な型・値・サブプログラムを渡してインスタンス化するまでは呼び出せない。"@ja ;
    skos:altLabel "generic subprogram" ;
    skos:altLabel "総称サブプログラム"@ja ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> .

<https://comcomponent.com/knowledge/ada-generic-package/> a skos:Concept ;
    skos:prefLabel "総称パッケージ(Generic Package)"@ja ;
    skos:definition "複数の操作と内部状態をまとめて再利用するための、generic宣言に続けて書くパッケージの雛形。インスタンスごとに内部状態は独立する。"@ja ;
    skos:altLabel "generic package" ;
    skos:altLabel "総称パッケージ"@ja ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> .

<https://comcomponent.com/knowledge/ada-generic-formal-type/> a skos:Concept ;
    skos:prefLabel "仮型パラメータ(Formal Type)"@ja ;
    skos:definition "generic部分で宣言する型の仮パラメータ。private、limited private、range<>、mod<>、digits<>、delta<>、(<>)などのカテゴリで、本体が使ってよい操作の範囲を指定する。"@ja ;
    skos:altLabel "formal type" ;
    skos:altLabel "private / range box / digits box" ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/ada-generic-instantiation/> ;
    ks:implements <https://comcomponent.com/knowledge/ada-generic-contract-model/> .

<https://comcomponent.com/knowledge/ada-generic-formal-subprogram/> a skos:Concept ;
    skos:prefLabel "仮サブプログラムパラメータ(Formal Subprogram)"@ja ;
    skos:definition "比較関数や述語などの振る舞いを注入するために、generic部分に書くサブプログラムの仮パラメータ。is<>を付けると可視な標準演算子で省略できる。"@ja ;
    skos:altLabel "formal subprogram" ;
    skos:altLabel "with function / with procedure" ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> ;
    ks:implements <https://comcomponent.com/knowledge/ada-generic-contract-model/> .

<https://comcomponent.com/knowledge/ada-generic-formal-package/> a skos:Concept ;
    skos:prefLabel "正式パッケージパラメータ(Formal Package)"@ja ;
    skos:definition "既にインスタンス化された総称パッケージそのものを、別のジェネリックの仮パラメータとして受け取る仕組み。ジェネリック部品同士の組み合わせに使う。"@ja ;
    skos:altLabel "formal package" ;
    skos:altLabel "with package" ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> ;
    ks:requires <https://comcomponent.com/knowledge/ada-generic-instantiation/> .

<https://comcomponent.com/knowledge/ada-generic-instantiation/> a skos:Concept ;
    skos:prefLabel "インスタンス化(instantiation)"@ja ;
    skos:definition "newを使って総称単位に具体的な型・値・サブプログラム・パッケージを渡し、通常のサブプログラムやパッケージを作ること。"@ja ;
    skos:altLabel "new によるインスタンス化"@ja ;
    skos:altLabel "instantiation" ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> .

<https://comcomponent.com/knowledge/ada-generic-formal-object/> a skos:Concept ;
    skos:prefLabel "仮オブジェクト(値)パラメータ(Formal Object)"@ja ;
    skos:definition "サイズや閾値のように、インスタンスごとに固定したい値を渡すためのgeneric部分の仮パラメータ。型による制約(Positiveなど)を持たせられる。"@ja ;
    skos:altLabel "formal object" ;
    skos:altLabel "値パラメータ"@ja ;
    skos:broader <https://comcomponent.com/knowledge/ada-generics/> ;
    ks:implements <https://comcomponent.com/knowledge/ada-generic-contract-model/> .

<https://comcomponent.com/knowledge/late-instantiation-error/> a skos:Concept ;
    skos:prefLabel "インスタンス化時にしか分からないテンプレートエラー"@ja ;
    skos:definition "ジェネリック/テンプレート本体の誤りが、具体的な型でインスタンス化するまでコンパイルエラーとして検出されない問題。C++テンプレートで歴史的に見られた。"@ja ;
    skos:altLabel "instantiation-time error" .

<https://comcomponent.com/knowledge/cpp-templates/> a skos:Concept ;
    skos:prefLabel "C++テンプレート"@ja ;
    skos:definition "C++のジェネリックプログラミング機構。歴史的にはインスタンス化して初めてエラーが出る性質があり、C++20のconceptsで制約を明示できるようになった。"@ja ;
    skos:altLabel "C++ templates" ;
    skos:altLabel "C++20 concepts" .

<https://comcomponent.com/knowledge/gnat/> a skos:Concept ;
    skos:prefLabel "GNAT"@ja ;
    skos:definition "GCCに含まれる無償のAdaコンパイラで、Adaの代表的な処理系。"@ja ;
    skos:altLabel "GNATコンパイラ"@ja ;
    ks:implements <https://comcomponent.com/knowledge/ada/> .

<https://comcomponent.com/knowledge/alire/> a skos:Concept ;
    skos:prefLabel "Alire"@ja ;
    skos:definition "Ada/SPARKのパッケージマネージャー兼ビルドツールで、ツールチェーン(GNAT)の取得・管理も担う。"@ja ;
    skos:altLabel "alr" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada-generics/> ;
    schema:description "Adaは1983年の最初の標準からジェネリック(総称単位)を言語機能として備えている。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generics/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-subprogram/> ;
    schema:description "Adaのジェネリックは、状態を持たないアルゴリズムを再利用する単位として総称サブプログラムを含む。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generics/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-package/> ;
    schema:description "Adaのジェネリックは、複数の操作と内部状態をまとめて再利用する単位として総称パッケージを含む。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-subprogram/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-type/> ;
    schema:description "総称サブプログラムは、type Element is private;のような仮型パラメータをgeneric部分に書くことで、任意の型に対して使える処理として定義される。ただし仮型パラメータは必須ではなく、仮オブジェクトや仮サブプログラムだけを取る総称サブプログラムも書ける。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-5.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generics/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-subprogram/> ;
    schema:description "Adaのジェネリックは、比較関数や述語のような振る舞いを注入するために仮サブプログラムパラメータを持てる。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-6.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generics/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-package/> ;
    schema:description "Adaのジェネリックは、あるジェネリックパッケージのインスタンスを別のジェネリックの入力として扱う正式パッケージパラメータを持てる。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-7.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generics/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-instantiation/> ;
    schema:description "総称単位はnewによるインスタンス化を経なければ、通常のサブプログラムやパッケージとして使えない。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-3.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-formal-type/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-instantiation/> ;
    schema:description "仮型パラメータに渡す具体的な型は、newによるインスタンス化の時点で指定される。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-3.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-package/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-type/> ;
    schema:description "総称パッケージ(例: Generic_Stack)は、Element_Typeのような型パラメータを仮パラメータとして持つ。ただし仮型パラメータは必須ではなく、仮パラメータを持たない総称パッケージや、仮オブジェクト・仮サブプログラム・仮パッケージだけを取る総称パッケージも書ける。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-5.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-package/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-object/> ;
    schema:description "値パラメータを持つ総称パッケージ(例: Generic_Stack)は、Max_SizeのようなPositive型の値パラメータを仮パラメータとして持ち、0以下のサイズではインスタンス化できない。ただしすべての総称パッケージが値パラメータを持つわけではない(例: 型パラメータのみのGeneric_Statistics)。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-4.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-formal-subprogram/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-contract-model/> ;
    schema:description "with function \"<\" (...) is <>;のような仮サブプログラムパラメータは、本体が使ってよい操作を契約として明示する。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-6.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-formal-type/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-contract-model/> ;
    schema:description "type Real is digits <>;のような型カテゴリの指定は、本体で使える演算(加減乗除など)の契約を明示する型レベルの仕様書として働く。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-5.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-contract-model/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/late-instantiation-error/> ;
    schema:description "ジェネリック本体を仮パラメータの契約の範囲だけで単独チェックするcontract modelにより、インスタンス化して初めてエラーが分かる事態が構造的に起きない。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-templates/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/late-instantiation-error/> ;
    schema:description "C++のテンプレートは歴史的には、テンプレート本体をインスタンス化して初めてエラーが出る性質を持っていた。C++20のconceptsにより改善されている。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/language/constraints> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-formal-package/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-instantiation/> ;
    schema:description "with package Stack is new Generic_Stack (<>);という正式パッケージパラメータは、あらかじめnewでインスタンス化された総称パッケージを受け取る。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-7.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/gnat/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada/> ;
    schema:description "GNATはAda言語のコンパイラとしての実装を担う、代表的な処理系である。"@ja ;
    ks:evidence <https://gcc.gnu.org/onlinedocs/gnat_ugn/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/gnat/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/alire/> ;
    schema:description "Alireを使う場合、GNATツールチェーンはAdaのパッケージマネージャーであるalr install gnat_native gprbuildで導入・管理できる(AdaCoreの公式インストーラーやOSのパッケージマネージャーなど他の導入方法もある)。"@ja ;
    ks:evidence <https://alire.ada.dev/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-subprogram/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-subprogram/> ;
    schema:description "本記事のGeneric_Insertion_Sortのように仮サブプログラムパラメータを持たせる場合、総称サブプログラムは比較関数のような仮サブプログラムパラメータを持てる。ただし必須ではなく、Generic_Swapのように仮サブプログラムパラメータを持たない総称サブプログラムもある。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-6.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-package/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-subprogram/> ;
    schema:description "本記事のGeneric_KV_Storeのように仮サブプログラムパラメータを持たせる場合、総称パッケージはキー一致判定の\"=\"のような仮サブプログラムパラメータも持てる。ただし必須ではなく、Generic_StackやGeneric_Statisticsのように仮サブプログラムパラメータを持たない総称パッケージもある。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-6.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-instantiation/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-formal-object/> ;
    schema:description "仮オブジェクト(値)パラメータを持つ総称単位をインスタンス化する場合、Max_Entriesのような値パラメータへの対応が必要になる。デフォルト値が定義されていれば省略でき、その場合はデフォルト値が使われる。仮オブジェクトパラメータを持たない総称単位(例: Generic_Swap)ではこの関係自体が生じない。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-4.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ada-generic-formal-object/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/ada-generic-contract-model/> ;
    schema:description "Max_Size : Positive;のような値パラメータへの型による制約は、0以下のサイズでインスタンス化できないという契約を表す。"@ja ;
    ks:evidence <https://www.adaic.org/resources/add_content/standards/22rm/html/RM-12-4.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
