我想创建一个prolog程序,以便它可以搜索列表中的最小数量,并且当用户请求更多解决方案(使用;符号)程序返回下一个最小数字。如果用户请求另一个解决方案,它将返回下一个号码,依此类推。我已经创建了最小谓词,但无法使其回溯以获得更多结果,请帮助。Prolog程序找到列表中的最小值和下一个最小值
在此先感谢。
PS我使用的束缚水饱和度,序言
我想创建一个prolog程序,以便它可以搜索列表中的最小数量,并且当用户请求更多解决方案(使用;符号)程序返回下一个最小数字。如果用户请求另一个解决方案,它将返回下一个号码,依此类推。我已经创建了最小谓词,但无法使其回溯以获得更多结果,请帮助。Prolog程序找到列表中的最小值和下一个最小值
在此先感谢。
PS我使用的束缚水饱和度,序言
简单得不能再简单的解决方案:对列表进行排序,并返回该列表中的每个成员:
min(List, Min) :-
sort(List, Sorted),
member(Min, Sorted).
我们基于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
).
@false。或者应该是“(”“)。”去呢? – repeat 2015-12-09 15:39:22
太。它没有帮助:这种方式没有被提及。所以你需要一个额外的参考提及谓词指标。 – false 2015-12-09 15:46:22
@false。 '(;)/ 2'的形式?我想知道'一个; b;假'与'(a; b; c)'有什么不同?...... ......''如何?: - M = 1; M = 2; M = 3;假。“作为答案? – repeat 2015-12-09 17:50:22