2010-11-10 2 views
1

Наше задание - отображать временные рамки событий в 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

@Paul: [ "Домашнее задание тегов, как теги других так называемых 'мета', в настоящее время не рекомендуется,"] (HTTP: //meta.stackoverflow.com/q/10812), но, @Highi, пожалуйста (как всегда) следуйте [общим рекомендациям] (http://tinyurl.com/so-hints): укажите какие-либо специальные ограничения, покажите, вы пробовали до сих пор и спрашиваете, что конкретно вас путает. – 2010-11-10 17:02:32

+0

39 вопросов были помечены домашней работой на прошлой неделе. Не все из меня :) Так обескуражен это может быть кто-то, но он также широко используется. Я (как и другие, мне кажется) все равно будет использовать его для вопросов, которые пахнут домашней работой, но не соглашайтесь на него в вопросе –

+0

Прошу прощения, если я не объясню это, но да, это домашнее задание. Я не ожидаю, что кто-то просто «giv mah teh codez», но я на самом деле пытаюсь что-то узнать здесь. Я знаю, что мой вопрос был немного расплывчатым, поэтому я буду перефразировать его. – Highi

ответ

0

Являются ли временные интервалы кратными 5? Подразумевает a перед(), что событие помещается в следующий временной интервал? Имеет ли событие только один факт события? Тогда вы можете попробовать что-то следующее.

Определить предикат 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.

Bye

(с) 2010, Ян кошель, 8004 Zürich

Смежные вопросы