需要重新构造prolog代码

时间:2017-11-12 15:49:39

标签: prolog

我有以下代码:

edge(a,b,5).
edge(b,a,5).
edge(b,c,3).
edge(c,a,2).
edge(c,d,4).
edge(d,b,6).
edge(c,f,4).
edge(f,c,4).
edge(e,c,5).
edge(f,e,7).
edge(g,a,3).
edge(d,g,8).
edge(e,g,2).
edge(f,h,3).
edge(h,i,2).
edge(i,j,3).
edge(j,h,4).
edge(d,h,1).
edge(j,f,6).
%edge(l,k,-1).
%edge(k,l,4).
%edge(a,z,-2).

vertex(a).
vertex(b).
vertex(c).
vertex(d).
vertex(e).
vertex(f).
vertex(g).
vertex(h).
vertex(i).
vertex(j).

member(A, [A|_]) :- !.
member(A, [_|Y]) :- member(A, Y).

path(X,Y) :- pathHelper(X,Y,[],0).
pathHelper(X,X,L, W) :- write([X|L]), write(W).
pathHelper(X,Y,L, W) :- edge(X,Z,C),\+member(Z,L),F is W+C,pathHelper(Z,Y,[X|L], F).

我想知道如何将路径转换为具有4个参数的函数,因此当调用路径(a,h,L,W)时会给出

L = [a,b,c,d,h],

W = 13;

L = [a,b,c,f,h],

W = 15;

1 个答案:

答案 0 :(得分:1)

尝试研究累加器的概念(他们称之为prolog中的累加器,结果的额外参数),这很有意思,顺便说一下,它的工作量不大:

path(X,Y,Distance,Result):-
  pathHelper(X,Y,[],0,Distance,Result).

pathHelper(X,X,L,W,W,P):- 
    reverse([X|L],P).

pathHelper(X,Y,L, W,Distance,Result):- 
 edge(X,Z,C),
 \+member(Z,L),
 F is W+C,
 pathHelper(Z,Y,[X|L], F,Distance,Result).