在 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 提供了非常有用的解决方法和简单的解释。