0

私はPrologの初心者で、すでに理解すべき問題がいくつかあります。つまり、コンソールによって導入されたいくつかの文字列を追加するテストを行っていました:

append_str([],Adder,Adder).
append_str([Head|Tail],Adder,Result):-
    append_str(Tail,[Head|Adder],Result).

sread_str(String):-
    read(String),
    atom(String).

sinput:-
    sinput_str([]).

sinput_str(Lista):-
    sread_str(String),
    sinput_str([String|List]).

sinput_str(List):-
    append_str(List,[],Result),
    nl,
    display(Result),
    nl.

そして最終的には常にこの出力を取得します:

|-? sinput.
sinput.
hello.
hello.
world.
world.
9.
9.

'.'(hello,'.'(world,[]))

数値は、コンソールがさらに値を要求するのを終了するためのものです。何が問題なのかわかりません。よろしくお願いします。

4

1 に答える 1

0

数値を入力してsread_str を強制的に失敗させるとどうなるかを理解しようとする必要があります。

Prolog は、与えられた目標を証明するために利用可能なすべての代替案を探索し、それによって変数を変更し、パスが失敗したときにそのような変更を元に戻します。このようなモデルは、IO (読み取り/表示ビルトイン) に必要な副作用によって複雑になります。

次に、最初に次のような sinput_str を動作させようとします。

sinput_str([String|List]):-
    sread_str(String),
    sinput_str(List).
sinput_str([]).
于 2012-12-16T18:44:24.417 に答える