List 如何在SWI Prolog中使用优先级队列?

List 如何在SWI Prolog中使用优先级队列?,list,prolog,priority-queue,dijkstra,a-star,List,Prolog,Priority Queue,Dijkstra,A Star,我试图在SWI Prolog中实现A*算法。我有一个图,它的每个状态由以下值组成(到目前为止,成本是启发式的,“不重要”、“不重要”、“不重要”),我想根据启发式将状态插入优先级队列,启发式是一个整数。如何做到这一点?一种简单的方法是使用键值对列表,其形式如下: [1-state(Cost_so_far, ...), 2-state(...), 3-state(...)] 启发式中的整数值将是关键,带有状态函子的复合项(您需要的任何算术数)将是值。请注意,这是保存配对列表的常规方法。您可以使用

我试图在SWI Prolog中实现A*算法。我有一个图,它的每个状态由以下值组成
(到目前为止,成本是启发式的,“不重要”、“不重要”、“不重要”)
,我想根据启发式将状态插入优先级队列,启发式是一个整数。如何做到这一点?

一种简单的方法是使用
键值对列表,其形式如下:

[1-state(Cost_so_far, ...), 2-state(...), 3-state(...)]
启发式中的整数值将是关键,带有
状态
函子的复合项(您需要的任何算术数)将是值。请注意,这是保存配对列表的常规方法。您可以使用匹配将它们取出,例如,队列头部的状态为:

[Heuristic-state(A, B, C)|QueueRest]

每次在队列顶部添加新状态时,您可能都应该使用内置的进行排序(非常有效)。

一种简单的方法是使用
键值
对列表,其形式如下:

[1-state(Cost_so_far, ...), 2-state(...), 3-state(...)]
启发式中的整数值将是关键,带有
状态
函子的复合项(您需要的任何算术数)将是值。请注意,这是保存配对列表的常规方法。您可以使用匹配将它们取出,例如,队列头部的状态为:

[Heuristic-state(A, B, C)|QueueRest]
每次在队列顶部添加新状态时,您可能都应该使用内置程序对其进行排序(非常有效)。

您可以使用“堆”库,它是“优先级队列”概念的实现。理查德·奥基夫(Richard O'Keefe)的一个堆序言实现正在运行。SWI Prolog在其Lars Buitinck的“heaps”库中还附带了一个堆实现。Logtalk(在几个Prolog系统上运行,包括SWI Prolog)还包括从Richard的原始实现派生的最大和最小堆。使用启发式值作为建议的键,堆应该比每次添加新对时必须使用的列表更有效

一些有用的链接:

您可以使用“堆”库,它是“优先级队列”概念的实现。理查德·奥基夫(Richard O'Keefe)的一个堆序言实现正在运行。SWI Prolog在其Lars Buitinck的“heaps”库中还附带了一个堆实现。Logtalk(在几个Prolog系统上运行,包括SWI Prolog)还包括从Richard的原始实现派生的最大和最小堆。使用启发式值作为建议的键,堆应该比每次添加新对时必须使用的列表更有效

一些有用的链接:


这是优先级队列的基本实现。 我刚开始学序言。 如果有更好的方法来实现优先级队列,请在下面进行评论

抽头(X[X | R],R)。
抽头(X,[F | Fs],[F | S]):-抽头(X,Fs,S)。
删除元素([H | T]):-min | p([H | T],99,MinP),search | MinP(MinP,[H | T],Num),
抽头((Num,MinP),[H | T],Z),写入(Z)。
ins([],L,L)。
ins([(Num,Priority)| T],L,[(Num,Priority)| Z]):-ins(T,L,Z)。
/*在这里,我使用ins函数将(Num,Priority)附加到现有队列
如果[(99,2)、(90,1)、(96,3)],这是优先级队列。如果要添加(93,4)
ins([(93,4)],[(99,2),(90,1),(96,3)],Z)。
Z=[(99,2)、(90,1)、(96,3)、(93,4)]
*/
最小值([],最小值,最小值)。
min_p([(Num,Priority)| Z],X,Y):-PriorityX,最小p(Z,X,Y)。
/*min_p在这里,我用来从给定优先级队列中找到最小优先级。
X应该是INT_MAX
min_p([(99,2),(90,1),(96,3),(93,4)],999,Y)。
Y=1。
*/
search_minp(Priority,[(Num,P)| T],Num):-优先级是P。
search_minp(Priority,[(Num,P1)| T],X):-search_minp(Priority,T,X)。
/*search_minp用于搜索对应于最小优先级的元素。
如果这是我们的优先级队列[(99,2)、(90,1)、(96,3)、(93,4)]
search_minp(1,[(99,2),(90,1),(96,3),(93,4)],Z)。
Z=90。
*/

这是优先级队列的基本实现。 我刚开始学序言。 如果有更好的方法来实现优先级队列,请在下面进行评论

抽头(X[X | R],R)。
抽头(X,[F | Fs],[F | S]):-抽头(X,Fs,S)。
删除元素([H | T]):-min | p([H | T],99,MinP),search | MinP(MinP,[H | T],Num),
抽头((Num,MinP),[H | T],Z),写入(Z)。
ins([],L,L)。
ins([(Num,Priority)| T],L,[(Num,Priority)| Z]):-ins(T,L,Z)。
/*在这里,我使用ins函数将(Num,Priority)附加到现有队列
如果[(99,2)、(90,1)、(96,3)],这是优先级队列。如果要添加(93,4)
ins([(93,4)],[(99,2),(90,1),(96,3)],Z)。
Z=[(99,2)、(90,1)、(96,3)、(93,4)]
*/
最小值([],最小值,最小值)。
min_p([(Num,Priority)| Z],X,Y):-PriorityX,最小p(Z,X,Y)。
/*min_p在这里,我用来从给定优先级队列中找到最小优先级。
X应该是INT_MAX
min_p([(99,2),(90,1),(96,3),(93,4)],999,Y)。
Y=1。
*/
search_minp(Priority,[(Num,P)| T],Num):-优先级是P。
search_minp(Priority,[(Num,P1)| T],X):-search_minp(Priority,T,X)。
/*search_minp用于搜索对应于最小优先级的元素。
如果这是我们的优先级队列[(99,2)、(90,1)、(96,3)、(93,4)]
search_minp(1,[(99,2),(90,1),(96,3),(93,4)],Z)。
Z=90。
*/

请阅读“”,既然这是一个增强,为什么不从它开始呢?在RosettaCode中有许多编程语言,包括检查RosettaCode是否显示Prolog没有条目。这声称在中的Prolog中有一个*未经验证。另一个问题是请阅读“”中的Prolog中显示一个*。既然是一个增强,为什么不从它开始呢?在RosettaCode中有许多编程语言,包括检查RosettaCode是否显示没有Prolog条目。这声称在中的Prolog中有*未验证。另一个问题