在阅读时将X插入排序列表中的正确位置

时间:2013-04-07 01:54:14

标签: prolog insertion-sort

我尝试了很多思考如何在阅读时在排序列表中添加值,而我并没有弄明白。

我必须逐行读取文件,并将它们添加到排序列表中的正确位置。

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]).

我尝试创建一个函数来读取(Stream,X)并将X传递给insert(X,[],[]),或者将其放在read_file函数列表参数中(并确保获得未定义)。逻辑上第一步是好的,但我没弄明白我是如何进入下一步的。没有想法。

2 个答案:

答案 0 :(得分: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).

答案 1 :(得分: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)