【问题标题】:Create a list from user input in Prolog从 Prolog 中的用户输入创建列表
【发布时间】:2021-01-03 10:57:14
【问题描述】:

我无法在 prolog 上执行此操作

程序会要求输入元素个数:6

然后用户将输入6个数字, 4, 3, 6, 2, 9, 10

那么prolog就会升序排序

排序列表:2 3 4 6 9 10

【问题讨论】:

    标签: sorting merge prolog user-input


    【解决方案1】:

    1- 使用 read 输入前六位数字。

    2- 将它们全部放在一个列表中。列表=[X1,X2,X3,X4,X5,X6]

    3- 现在使用内置的排序谓词。您可以使用其中任何一个 sort/2 参数或 sort/4 参数。两者的区别在于,在 sort/2 中它会删除重复值([4,1,5,5,2] -> [1,2,4,5]),而在 sort/4 中它会保留重复值([4,1,5,5,2] -> [1,2,4,5,5])。

    start:-
        writeln('Enter First digit'),
        read(X1),
        writeln('Enter Second digit'),
        read(X2),
        writeln('Enter Third digit'),
        read(X3),
        writeln('Enter Fourth digit'),
        read(X4),
        writeln('Enter Fifth digit'),
        read(X5),
        writeln('Enter Sixth digit'),
        read(X6),
        List=[X1,X2,X3,X4,X5,X6],
       % sort(List,Sorted),
        sort(0,@=<,List,Sorted),
        write('Sorted:'),write(Sorted).
    

    示例:

    ?- start.
    Enter First digit
    4
    Enter Second digit
    1
    Enter Third digit
    5
    Enter Fourth digit
    5
    Enter Fifth digit
    2
    Enter Sixth digit
    8
    Sorted: [1, 2, 4, 5, 5, 8]
    1true
    

    【讨论】:

      【解决方案2】:

      考虑到元素的数量可能会有所不同,一个可能的解决方案是:

      main :-
          writeln('Number of items? '),
          read(N),
          length(L, N),
          maplist(read, L),
          sort(L, S),
          format('Sorted list: ~w~n', [S]).
      

      【讨论】:

      • 谢谢你。另一个问题,我可以将这个合并排序代码实现为排序代码mergesort([], []). mergesort([A], [A]). mergesort([A, B|R], S) :- split([A, B|R], L1, L2), mergesort(L1, S1), mergesort(L2, S2), merge(S1, S2, S). split([],[],[]). split([A], [A],[]). split([A, B|R], [A|Ra], [B|Rb]) :- split(R, Ra, Rb). merge(A, [], A). merge([], B, B). merge([A|Ra], [B|Rb], [A|M]) :- A =&lt; B, merge(Ra, [B|Rb], M). merge([A|Ra], [B|Rb], [B|M]) :- A &gt; B, merge([A|Ra], Rb, M).
      • @seungcheol 您可以将谓词main 更改为调用mergesort(L,S),而不是sort(L,S)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2021-08-20
      • 2019-03-19
      相关资源
      最近更新 更多