【发布时间】:2015-12-09 23:38:45
【问题描述】:
我想创建一个 prolog 程序,以便它可以在列表中搜索最小数字,并且当用户要求更多解决方案(使用 ; 符号)时,程序返回下一个最小数字。如果用户要求另一个解决方案,它会返回下一个数字,依此类推。我已经创建了最小谓词,但无法回溯以获得更多结果,请帮助。
提前致谢。
P.S 我正在使用 Swi-prolog
【问题讨论】:
标签: prolog
我想创建一个 prolog 程序,以便它可以在列表中搜索最小数字,并且当用户要求更多解决方案(使用 ; 符号)时,程序返回下一个最小数字。如果用户要求另一个解决方案,它会返回下一个数字,依此类推。我已经创建了最小谓词,但无法回溯以获得更多结果,请帮助。
提前致谢。
P.S 我正在使用 Swi-prolog
【问题讨论】:
标签: prolog
我们根据list_minnum/2、tfilter/3和dif/3定义list_nextmin_gt/3:
list_nextmin_gt(Zs0, M, Zs) :-
list_minnum(Zs0, M0),
tfilter(dif(M0), Zs0, Zs1),
( M0 = M,
Zs = Zs1
; list_nextmin_gt(Zs1, M, Zs)
).
示例查询:
?- list_nextmin_gt([3,2,1,2,3], M, Rest).
( M = 1, Rest = [3,2,2,3]
; M = 2, Rest = [3,3]
; M = 3, Rest = []
; false
).
或者,如果您不关心剩余的列表项,只需编写:
?- list_nextmin_gt([3,2,1,2,3], M, _).
( M = 1
; M = 2
; M = 3
; false
).
【讨论】:
(;)/2 的数量?我想知道a ; b ; false 和(a ; b ; c) 有什么不同...... :- M=1 ; M=2 ; M=3 ; false. 作为答案怎么样?
非常简单的解决方案:对列表进行排序并返回该列表的每个成员:
min(List, Min) :-
sort(List, Sorted),
member(Min, Sorted).
【讨论】: