我在 Prolog 中创建了这个知识库,它反映了一家巴士公司的巴士往返地点,在设定的时间出发和到达:
connection(kerkrade, heerlen, 1100, 1200).
connection(kerkrade, bleijerheide, 1100, 1225).
connection(heerlen, kerkrade, 1115, 1230).
connection(heerlen, maastricht, 1230, 1330).
connection(maastricht, heerlen, 1430, 1530).
connection(maastricht, sittard, 1331, 1430).
connection(maastricht, sittard, 1345, 1445).
connection(sittard, maastricht, 1630, 1530).
connection(sittard, denbosch, 1530, 1700).
connection(denbosch, sittard, 1800, 1930).
connection(denbosch, amsterdam, 1000, 1330).
checkTime(X,Y,Z):-
connection(X,Y,S,_),
(Z =< S).
aRoute(From, To, Time):-
checkTime(From,To,Time).
testRoute(A,B,T):-
walk(A,B,T,[]).
walk(A,B,Time,V) :-
aRoute(A,X,Time),
not(member(X,V)),
(
B = X;
connection(A,X,_,S), walk(X,B,S,[A|V])
).
每当我询问我的知识库是否有两点之间的路线时,它都会返回是否可能;true
或false
:
testRoute(kerkrade, sittard, 900).
true; (signifies that there are three routes, of which two are possible)
true;
false.
然而,这不是我想要的。在最好的情况下,我想显示用于在顶层的两点之间创建路线的连接,如下所示:
connection(kerkrade, heerlen, 1100, 1200)
connection(heerlen, maastricht, 1230, 1330)
/* and so on.. */
我该怎么做呢?我想我必须传递一个变量,就像X
我对 testRoute 的调用一样,以便它可以报告它的值。我无法为此编写谓词,因为我不确定将它放在哪里。我的想法是我必须添加一个额外的参数,walk(A,B,Time,V)
但我不知道在那之后我可以用它做什么,以便让它报告路线的中间步骤。