将两个谓词合并为一个 - Prolog
Merge two predicates in one - Prolog
我是 prolog 的初学者,需要使用回溯为地铁站应用程序编写谓词 path(Start, Dest, Path)
。鉴于一些事实:connected(x,y)
描述连接的站点,我设法做到了以下
%% Some facts (for illustration):
connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).
%% Direction A (e.g from b to e)
path1(Start, End, [[Start,End]]):- (connected(Start,End) ; connected(End,Start)),!.
path1(Start, End, [[Start,X]|Path]):-
connected(Start, X),
path1(X, End, Path).
%% Direction B (e.g from f to A)
path2(Start, End, [[Start,End]]):- (connected(Start,End) ; connected(End,Start)),!.
path2(Start, End, [[Start,X]|Path]):-
connected(X, Start),
path2(X, End, Path).
%% And for the required predicate:
path(Start, End, Path):-
path1(Start, End, Path)
;
path2(Start, End, Path).
以上谓词按要求正常工作,但我想做的是以更好的方式将这两个谓词合并为一个谓词,但我不知道具体如何操作。有人可以帮忙吗?
提前致谢。
编辑:
我修改为:
path(Start, End, [[Start,End]], _):- (connected(Start,End) ; connected(End,Start)),!.
path(Start, End, [[Start,X]|Path], Direction):-
(Direction == 0,
connected(Start, X),
path(X, End, Path,0))
;
(Direction == 1,
connected(X, Start),
path(X, End, Path,1))
%% And for the required predicate:
path(Start, End, Path):-
path(Start, End, Path, 0)
;
path(Start, End, Path, 1).
但仍然需要删除更多重复的代码行。
一个可能的解决方案是:
path(Start, End, Path) :-
path(_, Start, End, Path).
path(_, Start, Start, []).
path(Direction, Start, End, [[Start,X]|Path]) :-
link(Direction, Start, X),
path(Direction, X, End, Path).
link(forward, X, Y) :- connected(X, Y).
link(backward, X, Y) :- connected(Y, X).
connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).
示例:
?- path(c, a, P).
P = [[c, b], [b, a]] ;
false.
?- path(a, c, P).
P = [[a, b], [b, c]] ;
false.
?- path(D, a,c,P).
D = forward,
P = [[a, b], [b, c]] ;
false.
?- path(D, c, a, P).
D = backward,
P = [[c, b], [b, a]] ;
false.
我是 prolog 的初学者,需要使用回溯为地铁站应用程序编写谓词 path(Start, Dest, Path)
。鉴于一些事实:connected(x,y)
描述连接的站点,我设法做到了以下
%% Some facts (for illustration):
connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).
%% Direction A (e.g from b to e)
path1(Start, End, [[Start,End]]):- (connected(Start,End) ; connected(End,Start)),!.
path1(Start, End, [[Start,X]|Path]):-
connected(Start, X),
path1(X, End, Path).
%% Direction B (e.g from f to A)
path2(Start, End, [[Start,End]]):- (connected(Start,End) ; connected(End,Start)),!.
path2(Start, End, [[Start,X]|Path]):-
connected(X, Start),
path2(X, End, Path).
%% And for the required predicate:
path(Start, End, Path):-
path1(Start, End, Path)
;
path2(Start, End, Path).
以上谓词按要求正常工作,但我想做的是以更好的方式将这两个谓词合并为一个谓词,但我不知道具体如何操作。有人可以帮忙吗?
提前致谢。
编辑:
我修改为:
path(Start, End, [[Start,End]], _):- (connected(Start,End) ; connected(End,Start)),!.
path(Start, End, [[Start,X]|Path], Direction):-
(Direction == 0,
connected(Start, X),
path(X, End, Path,0))
;
(Direction == 1,
connected(X, Start),
path(X, End, Path,1))
%% And for the required predicate:
path(Start, End, Path):-
path(Start, End, Path, 0)
;
path(Start, End, Path, 1).
但仍然需要删除更多重复的代码行。
一个可能的解决方案是:
path(Start, End, Path) :-
path(_, Start, End, Path).
path(_, Start, Start, []).
path(Direction, Start, End, [[Start,X]|Path]) :-
link(Direction, Start, X),
path(Direction, X, End, Path).
link(forward, X, Y) :- connected(X, Y).
link(backward, X, Y) :- connected(Y, X).
connected(a,b).
connected(b,c).
connected(c,d).
connected(d,e).
connected(e,f).
示例:
?- path(c, a, P).
P = [[c, b], [b, a]] ;
false.
?- path(a, c, P).
P = [[a, b], [b, c]] ;
false.
?- path(D, a,c,P).
D = forward,
P = [[a, b], [b, c]] ;
false.
?- path(D, c, a, P).
D = backward,
P = [[c, b], [b, a]] ;
false.