Prolog - 在找到所需的解决方案后递归 returns 到初始状态

Prolog - Recursion returns to initial state after finding desired solution

我是 Prolog 的新手,我不知道我的谓词有什么问题。我正在尝试编写一个遍历顶点列表的谓词,例如 [a,b,d,f,k] 和 return edge(X, vertex1, vertex2) 中描述的活动。列表 [a,b,d,f,k] 的期望结果将是 [跳、跳、飞、哇]。

因为边被绑定在两个顶点之间,所以我做了一个谓词 call_act/2,它接受列表的前两项。 call_act/2 给出 act/3 完整列表,第二项,然后等待结果。 act/3 查找列表中第一项和第二项之间的边,然后将其附加到结果中。

edge(jump,a,b).
edge(run,a,c).
edge(jump,b,d).
edge(fly,d,f).
edge(jump,b,e).
edge(fly,c,f).
edge(run,c,g).
edge(go,d,h).
edge(sprint,e,i).
edge(flip,e,j).
edge(wow,f,k).

call_act([_|[]], _).
call_act([H,H2|T], Result) :-
    act([H,H2|T], H2, Result).

act(_,[],[_|_]).
act([H|T], Next, Result) :-
    findall(X, edge(X,H,Next), Result1),
    append(Result, Result1, ResultN),
    write(ResultN),
    nl,
    call_act(T, ResultN).

如果你 运行 这样的代码,它会找到正确的解决方案,但之后它会返回一个空列表。 Like this.

我已经尝试了几件事。当 ResultN 的完整列表长度为 -1 时,我试图停止递归,但这似乎不起作用。我已经尝试制作 act/3 的修改版本,其中包括最终顶点作为参数,希望我可以制作像 act([FinalVertex|_],_,_,FinalVertex). 这样的基本情况。但是我还没想出解决办法

我还编写了此代码的一个版本,将两个谓词合并为一个:

act([_|[]],_).
act([H,H2|T], Result) :-
    findall(X, edge(X,H,H2), Result1),
    append(Result, Result1, ResultN),
    write(ResultN),
    nl,
    act([H2|T], ResultN).

但这有同样的问题。

尝试执行以下操作:

act([], []).
act([_], []).
act([V1,V2|Vs], [A|As]) :-
    edge(A, V1, V2),
    act([V2|Vs], As).

示例:

?- act([a,b,d,f,k], L).
L = [jump, jump, fly, wow] ;
false.