【发布时间】:2018-11-11 06:44:34
【问题描述】:
像这样模拟地下管线的停靠点:
stop(line1, 1, station1).
stop(line1, 2, station2).
stop(line1, 3, station3).
stop(line1, 4, station4).
stop(line1, 5, station5).
stop(line2, 1, station2).
stop(line2, 2, station4).
其中stop(L, N, S) 表示S 是N'第L 线上的站点,我正在尝试定义path(S1, S2, P) 来计算S1 和S2 之间的可能路径。
这里的路径是“段”的列表,段是沿同一条线的旅程,即segment(L,S1,S2) 表示沿线L 从S1 到S2 的连续旅程。所以path(a,d,P) 的一个可能解决方案是P=[segment(line1, a, b), segment(line2, b, d)],即在line1 上从a 到b,然后在line2 上从b 到d。
另外一个限制是路径不能多次包含同一行。
我有以下内容:
segment(L, S1, S2) :- stop(L, N1, S1), stop(L, N2, S2), N2>N1.
line_present_in_path(_, []) :- false.
line_present_in_path(L, [H|_]) :- segment(L, _, _) = H.
line_present_in_path(L, [_|T]) :- line_present_in_path(L, T).
path(S1, S2, [H]) :- segment(_, S1, S2) = H, H.
path(S1, S2, [H|T]) :- segment(L, S1, X) = H, H, \+line_present_in_path(L, T), path(X, S2, T).
但是发生了一些奇怪的事情。如果我自己明确指定所有参数,它会识别为正确的路径:
?- path(station1, station4, [segment(line1, station1, station2),segment(line2, station2, station4)]).
true ;
false.
但是,如果我要求它计算所有路径,它只会找到一条路径,与它刚刚验证为正确的路径不同:
?- path(station1, station4, P).
P = [segment(line1, station1, station4)] ;
false.
我必须承认我是 Prolog 的新手,所以我可能会遗漏一些基本的东西。但是,我真的不明白为什么它可以验证给定路径是否正确,但在尝试查找所有路径时却找不到该路径。
【问题讨论】:
标签: prolog