在 Sicstus prolog Samsort 中设置顺序方法
Setting order method in Sicstus prolog Samsort
我正在尝试对列表列表进行排序,例如 Books=[[5,1,science,24,3,2018],[6,1,math,24,3,2019],[4,2,science,24,5,2019],[6,2,science,23,3,2019],[3,1,math,24,3,2020]]
。我想根据每个元素的第 5 个值对这个列表进行排序。我尝试使用
samsort(sortDateBooks, Books, Output).
sortDateBooks(Book1,Book2):-nth0(5,Book1, Date1),nth0(5,Book2, Date2), Date1<Date2.
输出变量永远不会填充数据,原始列表也不会改变。
我觉得我没有正确声明 de order predicate 但找不到任何示例。
感谢您的帮助。
我不确定这是否是你想要做的,如果是,那么这可能会给你一些提示:
1. 这里收集日期将作为查找。它将搜索所有年份并将它们放入列表中,例如[2019,2018,2019,2019,2020].
2. sortBook(Sorted) 谓词首先使用collectdates 谓词查找所有年份,然后对它们进行排序。请注意,在排序中我使用了@=<,这不会删除任何重复的值。你会得到[2018,2019,2019,2019,2020].
3. s predicate 简单地获取每年,搜索信息并将其放入列表中。
s predicate 会每年抽查每本书,所以这可能会导致额外费用。 append 用于减少额外的括号,set predicate 只是删除重复项。
sortBook(Sorted):-
Book=[[6,2,science,23,3,2019],[5,1,science,24,3,2018],[6,1,math,24,3,2019],[4,2,science,24,5,2019]
,[3,1,math,24,3,2020]],
collectdates(Book,Clist),
sort(0, @=<, Clist, SList),
s(SList,Book,Sorted1),append(Sorted1,Sorted2),set(Sorted2,Sorted).
collectdates([],[]).
collectdates([H|T],[Last|List]):-
last(H,Last),
collectdates(T,List).
s([],_,[]).
s([H|T],[B|L],[W|List]):-
sortBook1(H,[B|L],W),
s(T,[B|L],List).
sortBook1(_,[],[]).
sortBook1(H,[B|L],[B|List]):-
member(H,B),
sortBook1(H,L,List).
sortBook1(H,[B|L],List):-
\+member(H,B),
sortBook1(H,L,List).
set([],[]).
set([H|T],[H|T2]):-
subtract(T,[H],T3),
set(T3,T2).
例子:
?-sortBook(Sorted).
Sorted = [[5, 1, science, 24, 3, 2018], [6, 2, science, 23, 3, 2019], [6, 1, math, 24, 3, 2019], [4, 2, science, 24, 5, 2019], [3, 1, math, 24, 3, 2020]]
false
好吧,我注意到我忘记导入 samsort 库,并且由于它的使用方式,不会显示任何错误。非常感谢@Reema Q Khan 提供了非常有用的解决方法和简单的解释。
我正在尝试对列表列表进行排序,例如 Books=[[5,1,science,24,3,2018],[6,1,math,24,3,2019],[4,2,science,24,5,2019],[6,2,science,23,3,2019],[3,1,math,24,3,2020]]
。我想根据每个元素的第 5 个值对这个列表进行排序。我尝试使用
samsort(sortDateBooks, Books, Output).
sortDateBooks(Book1,Book2):-nth0(5,Book1, Date1),nth0(5,Book2, Date2), Date1<Date2.
输出变量永远不会填充数据,原始列表也不会改变。
我觉得我没有正确声明 de order predicate 但找不到任何示例。
感谢您的帮助。
我不确定这是否是你想要做的,如果是,那么这可能会给你一些提示:
1. 这里收集日期将作为查找。它将搜索所有年份并将它们放入列表中,例如[2019,2018,2019,2019,2020].
2. sortBook(Sorted) 谓词首先使用collectdates 谓词查找所有年份,然后对它们进行排序。请注意,在排序中我使用了@=<,这不会删除任何重复的值。你会得到[2018,2019,2019,2019,2020].
3. s predicate 简单地获取每年,搜索信息并将其放入列表中。
s predicate 会每年抽查每本书,所以这可能会导致额外费用。 append 用于减少额外的括号,set predicate 只是删除重复项。
sortBook(Sorted):-
Book=[[6,2,science,23,3,2019],[5,1,science,24,3,2018],[6,1,math,24,3,2019],[4,2,science,24,5,2019]
,[3,1,math,24,3,2020]],
collectdates(Book,Clist),
sort(0, @=<, Clist, SList),
s(SList,Book,Sorted1),append(Sorted1,Sorted2),set(Sorted2,Sorted).
collectdates([],[]).
collectdates([H|T],[Last|List]):-
last(H,Last),
collectdates(T,List).
s([],_,[]).
s([H|T],[B|L],[W|List]):-
sortBook1(H,[B|L],W),
s(T,[B|L],List).
sortBook1(_,[],[]).
sortBook1(H,[B|L],[B|List]):-
member(H,B),
sortBook1(H,L,List).
sortBook1(H,[B|L],List):-
\+member(H,B),
sortBook1(H,L,List).
set([],[]).
set([H|T],[H|T2]):-
subtract(T,[H],T3),
set(T3,T2).
例子:
?-sortBook(Sorted).
Sorted = [[5, 1, science, 24, 3, 2018], [6, 2, science, 23, 3, 2019], [6, 1, math, 24, 3, 2019], [4, 2, science, 24, 5, 2019], [3, 1, math, 24, 3, 2020]]
false
好吧,我注意到我忘记导入 samsort 库,并且由于它的使用方式,不会显示任何错误。非常感谢@Reema Q Khan 提供了非常有用的解决方法和简单的解释。