微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sicstus prolog Samsort 中的设置顺序方法

如何解决Sicstus prolog Samsort 中的设置顺序方法

我正在尝试对 Books=[[5,1,science,24,3,2018],[6,math,2019],[4,2,5,23,[3,2020]] 等列表进行排序。我想根据每个元素的第 5 个值对这个列表进行排序。我尝试使用

samsort(sortDateBooks,Books,Output).
sortDateBooks(Book1,Book2):-nth0(5,Book1,Date1),nth0(5,Book2,Date2),Date1<Date2.

输出变量永远不会填充数据,原始列表也不会改变。

我觉得我没有正确声明 de order 谓词,但找不到任何示例。

感谢您的帮助。

解决方法

好吧,我注意到我忘记导入 samsort 库,并且由于它的使用方式,不会显示任何错误。非常感谢@Reema Q Khan 提供了非常有用的解决方法和简单的解释。

,

我不确定这是否是您想要做的,如果是,那么这可能会给您一些提示:

1. 此处收集日期将充当 findall。它将搜索所有年份并将它们放入列表中,例如[2019,2018,2019,2020]。

2. sortBook(Sorted) 谓词首先使用 collectdates 谓词查找所有年份,然后对它们进行排序。请注意,在排序中我使用了 @=

3. s 谓词只需要每年,搜索信息并将其放入列表中。

的谓词每年都会检查每本书,因此这可能会导致额外的内容。 append 用于减少额外的括号,set predicate 简单地删除重复项(如果有)。

sortBook(Sorted):-
    Book=[[6,2,science,23,3,2019],[5,1,24,2018],[6,math,[4,5,[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,W),s(T,List).
sortBook1(_,[],[]).
sortBook1(H,[B|List]):-
    member(H,B),sortBook1(H,L,List).
sortBook1(H,List):-
    \+member(H,List).

set([],[]).
set([H|T],[H|T2]):-
    subtract(T,[H],T3),set(T3,T2). 

示例

?-sortBook(Sorted).
Sorted = [[5,2020]]
false

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。