Prolog 序言:反复查找最小值,直到列表为空

Prolog 序言:反复查找最小值,直到列表为空,prolog,Prolog,如何重复提取最小数量,直到列表为空 我想找到一个最小值,然后将其从原始列表中排除,然后一次又一次地找到一个最小值,直到列表变为空 输入: ?- Find_Minimum([2, 1, 4, 3, 5], C) 输出: C = 1 C = 2 C = 3 C = 4 C = 5 False 这里是一个使用sort/2(在SWI中)的简单解决方案: 请记住,sort/2会删除重复项。如果要保留它们,请使用例如msort/2(在SWI中)。对于更简单的解决方案,您可以使用member/2: min

如何重复提取最小数量,直到列表为空

我想找到一个最小值,然后将其从原始列表中排除,然后一次又一次地找到一个最小值,直到列表变为空

输入:

?- Find_Minimum([2, 1, 4, 3, 5], C)
输出:

C = 1
C = 2
C = 3
C = 4
C = 5
False

这里是一个使用
sort/2
(在SWI中)的简单解决方案:

请记住,
sort/2
会删除重复项。如果要保留它们,请使用例如
msort/2
(在SWI中)。对于更简单的解决方案,您可以使用
member/2

minimum(L,E):-
    sort(L,LSorted),
    member(E,LSorted).

?- minimum([2,1,4,3,5],E).
E = 1
E = 2
E = 3
E = 4
E = 5

我本来会写——或多或少——与@damianodamiano(+1)相同的答案,但还是尝试编写比排序更“直接”的代码。结果证明结果是相当技术性的

:-模块(minext,[minext/2,minext/3])。
minext(长,米):-
minext(L,T,R),
(M=T
;minext(R,M)
).
minext(长、宽、宽):-
选择(X、L、R),
\+((
成员(Y,R),

Y这样做没有意义……只是如果他不想使用会员/2。。。
minimum(L,E):-
    sort(L,LSorted),
    member(E,LSorted).

?- minimum([2,1,4,3,5],E).
E = 1
E = 2
E = 3
E = 4
E = 5