prolog - 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))
解决方案
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).
推荐阅读
- django - 为什么此代码仅对超级用户返回 true
- python - uwsgi内存消耗逐渐增加,但消耗的内存没有释放
- java - 将 XML 解析为自定义格式
- excel - 动态范围 Excel VBA:您可以存储一个单元格范围,然后使用范围函数再次调用它吗?
- c# - 将 EF Core 查询从 2.2 转换为 3.0 - 异步等待
- r - 使用 plm 估计模型规范之间的范围内
- javascript - 列表在网页中不可点击。关于可能出现问题的任何建议?
- javascript - Next.js 动态路由 - 页面重新加载或直接调用动态路由时出现 404
- python - For loops with multiple result
- c# - Is there a difference between "double val = 1;" and "double val = 1D;"?