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.
我是 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.