3

私はすべてのクエリを実行するためにプロローグスクリプトを使用しています、コードは次のようになります:

:- initialization(run).

writeln(T) :- write(T), nl.

queryAll :-
    forall(query(Q), (Q ->
        writeln('yes':Q) ;
        writeln('no ':Q))).

run :-
    queryAll,
    halt.

query( (1,2,3) = (X,Y,Z) ).

問題は、queryAll次のような統合結果を見たいときに、「はい」または「いいえ」しか出力されないことです。

X = 1
Y = 2
Z = 3

プロローグでこれを行う方法は?前もって感謝します。

4

2 に答える 2

1

GNU Prolog では、end_of_term(eof)オプションをに渡すときに最後のドットを避けることができますread_term_from_atom。例えば、:

| ?- read_term_from_atom('X+Y = 1+2', T, [variable_names(L),end_of_term(eof)]).

L = ['X'=A,'Y'=B]
T = (A+B=1+2)``

これは、EOF (ファイルの終わり) が検出されると、読み取られるタームの終わりと見なされることを意味します。アトムから読み取る場合、EOF はアトムの文字列表現の then に対応します。

これにより、状況によっては物事を単純化できます。

于 2013-01-21T09:16:57.063 に答える
0

ここに、顧客にとってより良いエクスペリエンスを構築するのに役立つ可能性のあるgprologビルトインのサンプルがあります。

| ?- read_term_from_atom('X+Y = 1+2.', T, [variable_names(L)]).

L = ['X'=A,'Y'=B]
T = A+B=1+2

yes
| ?- read_term_from_atom('X+Y = 1+2.', T, [variable_names(L)]),call(T).

L = ['X'=1,'Y'=2]
T = 1+2=1+2

代わりにquery/1の内容を変更する必要があることに注意してください。

query( (1,2,3) = (X,Y,Z) ).

する必要があります

query( '(1,2,3) = (X,Y,Z).' ). % note the dot terminated atom

そして、ループは、例えば、

queryAll :-
    forall(query(Q), 
        ( read_term_from_atom(Q, T, [variable_names(L)]),
          ( T -> writeln('yes':L) ; writeln('no ':Q) )
        )).

私はこの答えからヒントを得ます。

于 2013-01-19T17:12:25.290 に答える