【发布时间】: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
我无法在 prolog 上执行此操作
程序会要求输入元素个数:6
然后用户将输入6个数字, 4, 3, 6, 2, 9, 10
那么prolog就会升序排序
排序列表:2 3 4 6 9 10
【问题讨论】:
标签: sorting merge prolog user-input
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
【讨论】:
考虑到元素的数量可能会有所不同,一个可能的解决方案是:
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 =< B, merge(Ra, [B|Rb], M). merge([A|Ra], [B|Rb], [B|M]) :- A > B, merge([A|Ra], Rb, M).
main 更改为调用mergesort(L,S),而不是sort(L,S)。