【发布时间】:2014-01-04 04:28:18
【问题描述】:
如何根据变量 Like 对事实进行排序
学生(5)。 学生(3)。 学生(2)。 学生(3)。 学生(6)。
我想制作让它们出现的功能
学生(2)。 学生(3)。 学生(3)。 学生(5)。 学生(6)。
【问题讨论】:
如何根据变量 Like 对事实进行排序
学生(5)。 学生(3)。 学生(2)。 学生(3)。 学生(6)。
我想制作让它们出现的功能
学生(2)。 学生(3)。 学生(3)。 学生(5)。 学生(6)。
【问题讨论】:
我会首先使用 findall 将所有这些事实收集到一个列表中(例如:How to create a list from facts in Prolog?),然后对这个列表进行排序(例如:Sorting a list in Prolog,或者只使用内置的 sort/2 谓词)。
(从我的手机发送)
【讨论】:
目前,它们不是正确的 Prolog 中的事实,您需要用小写字母来编写它们:
student(5).
student(3).
% etc
然后,你可以做几件事:
?- findall(S, student(S), Students), msort(Students, Sorted).
(在另一个答案中建议)
如果您想让它们在数据库中实际排序,并且不怕在运行时更改数据库,则可以使用 abolish/1 从数据库中删除所有 student/1 并重新插入已排序的事实:
reorder_students :-
findall(S, student(S), Students),
msort(Students, Sorted), % do not remove duplicates
abolish(student/1),
forall(
member(M, Sorted),
assertz(student(M))
).
重复执行此操作不是一个好主意!如果您有一个定期更改的学生数据库,您可能会考虑不将它们放入数据库中,而是使用例如library(assoc)中的关联列表
【讨论】:
setof/3,因为它会删除重复项。还是我以某种方式误解了您的评论?