以下のコメントは、おおまかに「より具体的」から「より一般的」の順に質問に対応しています。
まず、具体的なコメントに対処します。
私はハッシュテーブル/辞書を利用したでしょうが、私が知る限り、これはPrologでは実際には不可能です。
すべての深刻なProlog実装では、たとえばを使用して、Prolog用語を破壊的に変更できますsetarg/3
。を使用するarg/3
とsetarg/3
、用語の各引数にO(1)アクセスできます。これは、システムが用語のアリティに任意の制限を課していないことを前提として、他の言語とまったく同じようにハッシュテーブルを実装するのに十分です。
すべての用語で予期しない用語のコピーと共有を考慮に入れる必要があるため、これを自分で行うことはお勧めできません。代わりに、それを行うためにライブラリに依存します。
どの図書館?私は他の人が書いたことを2番目に説明します。ライブラリをハッシュする代わりに、などのツリーベースのライブラリを使用します。これらは平均的な場合のハッシュほど効率的ではありませんが、次のようになります。library(assoc)
library(avl)
- 彼らはしばしば十分に効率的です
- それらは非常に予測可能にスケーリングします。最も重要な操作は常にO(log(n))にあります。
また、他の人が書いているように、破壊的な変更は論理プログラミングと互換性がなく、ツリーライブラリには、 ISO Prologで、漸近的に最適な効率で純粋な方法で実装できるという大きな利点があります。
最後に、SWI-Prologのdict拡張機能は、ISOに準拠しておらず、構文的にも準拠していないため、準拠したPrologシステムに移植できません。ISO準拠の方法で中置ドットを追加する方法については、UlrichNeumerkelのコメントを参照してください。