Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Prolog中的数组中执行有序插入时出现意外行为_Arrays_Prolog_Graph Theory - Fatal编程技术网

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,
  !.