【问题标题】:Sorting facts in Prolog [closed]在 Prolog 中对事实进行排序[关闭]
【发布时间】:2014-01-04 04:28:18
【问题描述】:

如何根据变量 Like 对事实进行排序

学生(5)。 学生(3)。 学生(2)。 学生(3)。 学生(6)。

我想制作让它们出现的功能

学生(2)。 学生(3)。 学生(3)。 学生(5)。 学生(6)。

【问题讨论】:

    标签: sorting prolog


    【解决方案1】:

    我会首先使用 findall 将所有这些事实收集到一个列表中(例如:How to create a list from facts in Prolog?),然后对这个列表进行排序(例如:Sorting a list in Prolog,或者只使用内置的 sort/2 谓词)。

    (从我的手机发送)

    【讨论】:

      【解决方案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)中的关联列表

      【讨论】:

      • 您的第一个查询将返回 L=[3,5]。让 L=[student(3),student(5)] 怎么样,因为我认为 OP 正在寻找这个。我们也可以使用 setof/3 吗?
      • @ssBarBee 您的建议是将数据库中的事实列表与术语列表混淆。我想这是一个品味问题。如果您遵循确切的问题,则不能使用setof/3,因为它会删除重复项。还是我以某种方式误解了您的评论?
      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2015-10-31
      • 2023-03-03
      • 2014-02-18
      • 2012-12-13
      • 2011-11-02
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多