如何整齐地打印带有事件的时间表?

时间:2010-11-10 14:14:56

标签: prolog

我们的任务是在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开始前进,因为要找到第一个事件,你必须确定它是在其他事件之前还是其他事情?

1 个答案:

答案 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