Arrays 在Prolog中的数组中执行有序插入时出现意外行为
我需要使用一个数组实现一个队列,该数组需要进行升序排序。每个项目都是图形的一个节点,我正在使用*算法进行探索,即:Arrays 在Prolog中的数组中执行有序插入时出现意外行为,arrays,prolog,graph-theory,Arrays,Prolog,Graph Theory,我需要使用一个数组实现一个队列,该数组需要进行升序排序。每个项目都是图形的一个节点,我正在使用*算法进行探索,即: nodo(S, ListaAzioniPerS, C, S) 其中,S是节点的标识符,ListaAzioniPerS是到达该节点的路径,C是到目前为止的成本,S是它的启发。我需要按我称之为F的C+S之和排序 为此,我尝试通过以下代码进行有序插入: orderedInsert(X, [], [X]). orderedInsert(nodo(S, ListaAzioniPerS, C
nodo(S, ListaAzioniPerS, C, S)
其中,S
是节点的标识符,ListaAzioniPerS
是到达该节点的路径,C
是到目前为止的成本,S
是它的启发。我需要按我称之为F
的C+S
之和排序
为此,我尝试通过以下代码进行有序插入:
orderedInsert(X, [], [X]).
orderedInsert(nodo(S, ListaAzioniPerS, C, S),
[nodo(S1, ListaAzioniPerS1, C1, S1)|Rest],
[nodo(S, ListaAzioniPerS, C, S), nodo(S1, ListaAzioniPerS1, C1, S1)|Rest]) :-
F is C + S,
F1 is C1 + S1,
F < F1,
!.
%orderedInsert(nodo(S, ListaAzioniPerS, C, S),
% [nodo(S1, ListaAzioniPerS1, C1, S1)|Rest],
% [nodo(S, ListaAzioniPerS, C, S), nodo(S1, ListaAzioniPerS1, C1, S1)|Rest]) :-
% F is C + S,
% F1 is C1 + S1,
% F == F1,
% C < C1,
% !.
orderedInsert(X, [Y|Rest0], [Y|Rest]) :-
orderedInsert(X, Rest0, Rest).
尽管执行过程对我一点帮助都没有(实际上它让我怀疑我是否理解了prolog)。
知道我错在哪里吗
使用SWI Prolog。您的问题是变量S和S1的重复使用。 例如,您可以将它们更改为
orderedInsert(nodo(N, ListaAzioniPerS, C, S),
[nodo(N1, ListaAzioniPerS1, C1, S1)|Rest],
[nodo(N, ListaAzioniPerS, C, S), nodo(N1, ListaAzioniPerS1, C1, S1)|Rest]) :-
F is C + S,
F1 is C1 + S1,
F < F1,
!.
orderedInsert(nodo(N,ListaAzioniPerS,C,S),
[nodo(N1,列表1,C1,S1)|其余],
[nodo(N,ListaAzioniPerS,C,S),nodo(N1,ListaAzioniPerS1,C1,S1)|其余]:-
F是C+S,
F1是C1+S1,
F
你的代码也能用。顺便说一句,你可以减少一点混乱:
orderedInsert(nodo(N, ListaAzioniPerS, C, S),
[nodo(N1, ListaAzioniPerS1, C1, S1)|Rest],
[nodo(N, ListaAzioniPerS, C, S), nodo(N1, ListaAzioniPerS1, C1, S1)|Rest]) :-
C + S < C1 + S1,
!.
orderedInsert(nodo(N,ListaAzioniPerS,C,S),
[nodo(N1,列表1,C1,S1)|其余],
[nodo(N,ListaAzioniPerS,C,S),nodo(N1,ListaAzioniPerS1,C1,S1)|其余]:-
C+S
查询?-orderedInsert(nodo(nodo1,listaAzioniPerS,1,1),[nodo(nodo2,listaAzioniPerS1,2,1)],X)。
不与您编写的任何谓词统一(即失败)。。。萨尔维
orderedInsert(nodo(N, ListaAzioniPerS, C, S),
[nodo(N1, ListaAzioniPerS1, C1, S1)|Rest],
[nodo(N, ListaAzioniPerS, C, S), nodo(N1, ListaAzioniPerS1, C1, S1)|Rest]) :-
C + S < C1 + S1,
!.