2

読みながらソートされたリストに値を追加する方法を考えてみましたが、わかりませんでした。

ファイルから行ごとに値を読み取り、ソートされたリストの正しい位置に追加する必要があります。

SWI-PROLOG

input.txt がある場合: 1. 4. 2. 3. 8. 6.

リスト 1 に入れられた 1 を読まなければなりません。4 を読んでください --> 私のリストは 1 4 です。2 を読んでください ---> 私のリストは 1 2 4 .. などです。

関数の読み取りと挿入:

main :-open('input.txt', read, Str),read_file(Str,Lines),close(Str),write(Lines), nl.

read_file(Stream,[]) :-at_end_of_stream(Stream).

read_file(Stream,[X|L]) :-\+ at_end_of_stream(Stream),read(Stream,X),read_file(Stream,L).

insert(X,[Y|Sorted],[Y|Sorted1]):-X>Y,!,insert(X,Sorted,Sorted1).
insert(X,Sorted,[X|Sorted]).

read(Stream,X) 関数を作成し、X を insert(X,[],[]) に渡すか、read_file 関数のリスト パラメータに配置しようとしました (そして、確実に未定義になります)。論理的には最初のステップは問題ありませんが、次のステップに進む方法がわかりませんでした。アイデアはありません。

4

2 に答える 2

0

read_fileまず、入力出力を受け取るように変更する必要があります。次に、この句を変更する必要があります。

read_file(Stream,[X|L]) :-\+ at_end_of_stream(Stream),read(Stream,X),read_file(Stream,L).

insertアイテム自体を付加せずに呼び出します。あなたは次のようにそれを行うかもしれません:

read_file(Stream, Before, Result) :-
  \+ at_end_of_stream(Stream),
  read(Stream, X),
  insert(X, Before, After),
  read_file(Stream, After, Result).
于 2013-04-07T03:27:25.367 に答える
0

私はこのように書くでしょう

read_file(Stream, SoFar, Result) :-
    read(Stream, X),
    (   X == end_of_file
    ->  Result = SoFar
    ;   insert(X, SoFar, Updated),
        read_file(Stream, Updated, Result)
    ).

最初に空のリストで呼び出す必要があります:

?- read_file(user, [], L).
|: 4.
|: 5.
|: 1.
|: 7.
|: 2.
|: L = [1, 2, 4, 5, 7].

2 入力した後に ^D (システム上の end_of_file)

于 2013-04-07T05:28:39.490 に答える