2016-09-02 10 views
3

プロローグプログラムから副作用としてプロローグコードを出力するのに最も慣用的なアプローチは何ですか?Prolog:コードの生成

例えば、単純なケースでは、テキスト入力が与えられた場合、テキストを有向グラフとして表す別のPrologプログラムを生成するプログラムを作成することができます。

私はこの質問がやや曖昧であると理解していますが、メタ循環型インタープリタのアプリケーションをカバーするProlog Meta-Programmingの文献で満足のいく答えが見つからないと、Stackoverflowに相談しました。

この質問が他の方法で明確に表現されていると思われる場合は、編集するかコメントを残してください。

+0

少なくとも、テキスト入力と出力として必要なProlog表現の具体例を挙げてください。非慣用的なアプローチでは、あなたの質問も改善されます。 –

+0

ルールを生成し、それらをアサートし、 "listing/1"または同様のものを使用してください:http://www.swi-prolog.org/pldoc/man?section=listing –

+1

進歩しましたか?私はまた、Prolog(Ergo/Flora preferrably)の自動コード生成に興味がありますが、主流言語(C++、..)でハイパーグラフネットワーク(opencog/hypergraphdb)でコード合成のいくつかの試みをしましたか? –

答えて

1

writeq/1(またはformat( '〜q'、[...]))は、読み込み可能な出力を生成します。通常、節の本文の後に完全停止する必要もあります。例えば、

?- A_Clause = (X is 1+Y, write('X is '), write(X), nl), format('~q.~n', [A_Clause]). 

コードの可読性@Falseで述べたように、変数「素敵な名前」を失うことに苦しんでいるが、機能がある...

編集

、スペースを試してみてください出力期間がドットで終わる場合、ドットがバグを避ける前に

+0

''〜q。〜n ''は安全ではありません。 – false

+0

@false:ありがとう、私は答えをパッチします – CapelliC

+1

読み返すことができるPrologコードを書く最も安全な選択肢は、 write_canonical/1-2'述語。 –

3

最も慣用的な方法は常にになります純粋なを避けて、の副作用を避けてください。

トップレベルであなたのために執筆しましょう!について  Pを保持しているものを、論理的な関係の観点で、その後、

program(P) :- ... 

と述べを:

により、たとえば言う関係を定義し、Prologのプログラムを生成します。例えば

 
program(P) :- 
     P = (Head :- Body), 
     Head = head(A, B), 
     Body = body(A, B). 

例のクエリと答え:

 
?- program(P). 
P = (head(_G261, _G262):-body(_G261, _G262)). 

ので、純粋なようにして製造されたプログラムは、あります。

あなたがportray_clause/1を使用し、それを書きたい場合:

 
?- program(P), portray_clause(P). 
head(A, B) :- 
     body(A, B). 
... 

これは、自動的に多くのプログラムを生成するために、失敗駆動ループに有用であることができます。