我们的任务是在Prolog中显示事件的时间表。 我们的数据库看起来像这样:
event(e1, 20).
event(e2, before(e1)).
event(e3, before(e2)).
event(e4, 15).
event(e5, before(5)).
event(e6, 30).
event(e7, before(e2)).
我们的想法是将2个点(0和零)定义为固定值,并表示如下的时间轴:
0 5 15 20 30 nil
\ x x e4 e1 e6 /
\ e5/
\ x e3 e2 /
\ x e7 /
(抱歉,我不知道标签如何在这里工作,我无法发布截图)
我们的想法是找到从0到零的所有可能路径,并尝试查看哪些节点可以合并。
路径看起来像这样:
[
[0, e4, e1, e6, nil],
[0, e5, e4, e1, e6, nil],
[0, e3, e2, e1, e6, nil],
[0, e7, e2, e1, e6, nil]
]
我们如何以正确的顺序找到事件?看起来我们无法从0开始前进,因为要找到第一个事件,你必须确定它是在其他事件之前还是其他事情?
答案 0 :(得分:0)
时间段是5的倍数吗?意味着之前的一个() 事件被放置在下一个时段?事件是否只有 一个事件的事实?然后你可以尝试如下的东西。
定义谓词eff_time_slot(事件,时间)。它会 递归定义如下:
eff_time_slot(Event,Time) :- event(Event,Expr), eval_time_expr(Expr,Time).
eval_time_expr(Num,Num) :- number(Num), !.
eval_time_expr(before(Expr),Num) :- !, eval_time_expr(Expr,Help), Num is Help+5.
eval_time_expr(Event,Num) :- eff_time_slot(Event,Num).
如果一个事件可能有多个事件事实,那么你必须这样做 修改谓词eff_time_slot,它可以做一个findall 并取最大值eval_time_expr。
为了加快速度,你可以使用eff_time_slot的表格。整体 只要事件依赖关系形成DAG,上述工作就会起作用。
再见
(c)2010年,Jan Burse,8004Zürich