如何编写一个Prolog谓词,它将返回一个按值排序的后继事实列表

时间:2017-05-14 16:15:49

标签: list sorting prolog logic

所以我有一个名为get_order_successors(L)的谓词,我试图让它返回一个继承事实列表,按升序排序/排序。

此列表的示例可能如下所示:

 h(a,12).
 h(b,8).
 h(c,4).
 h(d,3).
 h(f,5).
 h(e,5).
 h(g,0).

到目前为止,这是我尝试过的。 设置一个列表,如 [[a,12],[b,8],[c,4]等等。] 并运行列表搜索子句,如下所示:

on(Item,[Item|Rest]).  

on(Item,[DisregardHead|Tail]):-
          on(Item,Tail).

其目的是逐个浏览列表,并将该列表的值添加到新列表中,将其置于开头或前面,具体取决于其值...但说实话我觉得因为我对这门语言很陌生而且我甚至不确定那个解决方案是否有用,所以我的头脑也很少了。

我确信这个问题有一个简单的解决方案,我现在还没有看到。任何认为他们可以提供帮助的人都会受到重视。 :)

1 个答案:

答案 0 :(得分:0)

假设您有一个谓词设置像[[a,12],[b,8],[c,4]等... []如你所描述的列表,你需要根据列表排序在每个内部列表的第二个元素上。因此,您需要实现排序算法(bubblesort,mergesort ...)或使用内置排序谓词,如sort/2

问题是sort / 2可以对列表列表进行排序,但是基于每个内部列表的第一个元素,例如:

?- sort([[b,2],[a,3]],L).
L = [[a, 3], [b, 2]].

所以它没有给出所需的结果:L = [[b, 2], [a, 3]]

如何解决?

只需编写设置列表的谓词,如:

set_up(L):- findall([X,Y], h(Y,X), L).

然后:

get_order_successors(L):- set_up(L1),sort(L1,L).

示例:

?-get_order_successors(L).
L = [[0, g], [3, d], [4, c], [5, e], [5, f], [8, b], [12, a]].

为了反转内部列表,只需编写一个谓词:

rev([],[]).
rev([[Number, Letter]|T], [[Letter, Number]|T1]):-rev(T,T1).

并添加如下:

get_order_successors(L):- set_up(L1),sort(L1,L2),rev(L2,L).