2010-11-18 11 views
3

Prologプログラムのルール依存グラフをPrologで作成したいとします。たとえば、次のプログラムPrologのルール依存グラフ

foo(X) :- bar(X, 0). 
bar(A, B) :- quux(A), coox(B). 
baz. 

は(assertを使用することによって)真であること、次のような結果になります。

depends(foo, [bar]). 
depends(bar, [quux, coox]). 
depends(baz, []). 

または私は簡単にグラフを作成するために使用できることは、上記のようなもの。私が考えてきたアプローチは、入力ファイルの行を文字列として読み込み、単純な検索と置換を実行することですが、それは醜い非プロローグのようなハックのようです。 Prologのメタデータ機能を利用する他のオプションはありますか?

+1

Prologは引数の数に基づいて述語名のオーバーロードを許可するので、単純名の代わりに 'Name/NArgs'項を使用する方がよいでしょう。 –

答えて

2

などでファイルを読み込む必要(非構造化)文字列ありません:プロローグのソースファイルが有効なProlog 用語のシーケンスですが、あなたは(たとえば)で句を読むことができる程度/ 1と理由を読んであなたは他の言葉についても同様です。 (: - )/ 2は既に定義済みの演算子であるため、Prologの組み込みメタ表現(arg/3、functor/3、= ../2など)で節を簡単に検査できます。これは、あなたが予想しているのと同じように、ソースレベルのコメントなどを自動的に処理します。

+1

構文的フォローアップの質問:入力を受け入れるルールをfoo: - bar、baz、X、Y)にするにはどうすればよいですか?今のところ、「foo:bar、baz」の部分を括弧で囲む必要があります。 – Igor

+1

もちろん、あなたはもちろん、(foo: - bar、baz)、X、Y)、それ以外の場合(すなわち、(foo: - bar、baz、X、Y)に依存する) "は、最初の引数の一部ではなく、depends/4の第2引数です。しかし、ファイルから句を読み込んだ場合、この問題は発生しません:考慮?read(Clause)。 "foo: - bar、baz"と入力すると(引用符なし)、句は自動的に用語(foo:-bar、baz)に統一され、? - 、clause_dependencies(句、Ds)、assertz(clause_depends_on(句、Ds))を続行できます。あなたが望むようにclause_dependencies/2を定義したと仮定します。 – mat

関連する問題