【问题标题】:Inserting X in its correct position in a sorted list while reading阅读时将 X 插入排序列表中的正确位置
【发布时间】:2013-04-07 01:54:13
【问题描述】:

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

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

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 函数列表参数(并确定未定义)。从逻辑上讲,第一步是可以的,但我不知道如何进入下一步。没有想法。

【问题讨论】:

    标签: prolog insertion-sort


    【解决方案1】:

    我会这样写

    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)

    【讨论】:

      【解决方案2】:

      首先,您需要修改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).
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-15
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        相关资源
        最近更新 更多