2

プロローグにインポートされたtxtファイルに応じて異なるファクトを構築するメカニズムを構築したいと思います。ファイルから読み取られた行を直接アサートする例をすでにいくつか見つけましたが、アサートを実行する前にデータを変換する必要があります。

例を挙げると:

man = {m1, m2}.

m1: w1 > w2.

次のように読む必要があります:

man(m1).
man(m2).
prefer(m1, w1, 1).
prefer(m1, w2, 2).

入力のシンボルに基づいてこれらのファクトを構築することは可能ですか?

4

3 に答える 3

4

はい-他の言語で行うことを行う必要があります。

ファイルを開いて読み取り、内容を解析して、主張できる用語に変換します。

幸いなことに、あなたはプロローグにいるので、「内容を解析する」は、言語が朝食のために行うタスクです。

この正確なタスクを実行する方法についてのチュートリアルを書いていることがわかりました。まだ完成していませんが、オンラインで

http://www.pathwayslms.com/swipltuts/dcg/

ファイルが大きい場合は、チュートリアルで説明されている方法を使用してファイルを読んでください。それ以外の場合は、ファイルを「コード」スタイルの文字列に入れて、そのまま続けます。

于 2012-12-23T21:59:25.187 に答える
3

例で提示されたデータが有効なProlog構文であるという事実のおかげで、このコードは

load_file_data(File) :-
    open(File, read, Stream),
    repeat,
    read(Stream, Term),
    (   Term = end_of_file
    ->  true
    ;   process(Term),
        fail
    ),
    close(Stream).

process(X = {L}) :-
    forall(arg(_, L, A), (F =.. [X, A], assert(F))).
process(X : A > B) :-
    assert(prefer(X, A, 1)),
    assert(prefer(X, B, 2)).

m1: w1 > w2の演算子の優先順位は期待できるものではありませんが、完全なパターンマッチングのおかげで、とにかく機能することに注意してください。使用する

?- write_canonical(m1 : w1 > w2).
>(:(m1,w1),w2)

わからない場合は優先順位を確認します。

于 2012-12-23T21:59:43.643 に答える
2

DCGで「通常の」プロローグを実行するには、{}で囲みます。

some_nonterminal-> "fridge"、blanks、[X]、{%ここに通常のPrologコードを入れることができますassert(fridge_named(X))}。

これは次のようなシーケンスを探します

冷蔵庫G

データベースでfridge_named(0x47)をアサートします(ASCII Gは0x47です)

于 2012-12-29T20:36:33.523 に答える