首页 > 解决方案 > Prolog-旅行路径和时间

问题描述

使用给定的数据,我们需要找到旅行路径和时间。

byCar(auckland,Hamilton,103).
byCar(hamilton,raglan,42).

这会给我路径

    go(X,Y):- byCar(X,Y).
    travel(X,Y):- go(X,Y).
    travel(X,Y):- go(X,Z), travel(Z,Y).
    travel(X,Y,go(X,Y)):- go(X,Y).
    travel(X,Y,go(X,Z,Path)):- go(X,Z), travel(Z,Y,Path).

我应该将时间作为第三个函数并将其递增为 T=t+t

go(X,Y):-byCar(X,Y,t).
travel(X,Y,T):- go(X,Y),
travel(X,Y,T):- go(X,Z), travel(Z,Y), T is t+t.

这仍然没有给我时间。

我的示例运行:

 ?. travel(auckland,raglan,Y).
    Y = go(auckland, hamilton, go(hamilton, raglan))

标签: prolog

解决方案


t是 Prolog 中的一个常数,因为它以小写字母开头,这意味着类似的查询byCar(X, Y, t).将失败,除非它t在事实中用作时间,但这不太可能。

您应该使用 unification 将时间与变量统一起来,例如:

go(X, Y, T):-
    byCar(X, Y, T).

travel(X, X, 0).
travel(X, Y, T) :-
    go(X, Z, T1),
    travel(Z, Y, T2),
    T is T1 + T2.

或使用蓄能器:

go(X, Y, T):-
    byCar(X, Y, T).

travel(X, Y, T) :-
    travel(X, Y, 0, T).

travel(X, X, T, T).
travel(X, Y, T1, T4) :-
    go(X, Z, T2),
    T3 is T1 + T2,
    travel(Z, Y, T3, T4).

注意,facts中要hamilton小写否则是变量,表示byCar(auckland,Hamilton,103).facts与所有auckland城市相连,每次取103个时间单位:

byCar(auckland, hamilton, 103).
byCar(hamilton, raglan, 42).

推荐阅读