2008/07/26 16:24:59 1 NDlog programs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ materialize(#link, 10, infinity, keys(1,2)). materialize(pingRTT, 10, 5, keys(1,2)). materialize(pendingPing, 10, 5, keys(1,2)). pp1 ping(@S,D,E) :- periodic(@S,E,5), #link(@S,D). pp2 pingMsg(S,@D,E) :- ping(@S,D,E), #link(@S,D). pp3 pendingPing(@S,D,E,T):- ping(@S,D,E), T = f_now(). pp4 pongMsg(@S,E) :- pingMsg(S,@D,E), #link(@D,S). pp5 pingRTT(@S,D,RTT) :- pongMsg(@S,E), pendingPing(@S,D,E,T), RTT = f_now() - T. pp6 #link(@S,D) :- pingRTT(@S,D,RTT). Query pingRTT(@S,D,RTT). 2 Predicates and Schema ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #link(@S,D,E) #link(@Source,Destination,EventID) ping(@S,D,E) ping(@Source,Destination,EventID) pingMsg(S,@D,E) pingMsg(Source,@Destination,EventID) pongMsg(@S,E) pongMsg(@Source,EventID) pendingPing(@S,D,E,T) pendingPing(@Source,Destination,EventID,Time) pingRTT(@S,D,RTT) pingRTT(@Source,Destination,RoundTripTime) Events: soft-state: ping link pingMsg pingRTT pongMsg pendingPing periodic(@S,E,5) predicate denotes an infinite stream of periodic event tuples generated at node S every 5 seconds with random identifier E. 3 Dropping Event ID ~~~~~~~~~~~~~~~~~~~ #link(@S,D) #link(@Source,Destination) ping(@S,D) ping(@Source,Destination) pingMsg(S,@D) pingMsg(Source,@Destination) pongMsg(@S) pongMsg(@Source) pendingPing(@S,D,T) pendingPing(@Source,Destination,Time) pingRTT(@S,D,RTT) pingRTT(@Source,Destination,RoundTripTime) pp1 ping(@S,D) :- periodic(@S,5), #link(@S,D). pp2 pingMsg(S,@D) :- ping(@S,D), #link(@S,D). pp3 pendingPing(@S,D,T) :- ping(@S,D), T = f_now(). pp4 pongMsg(@S) :- pingMsg(S,@D), #link(@D,S). pp5 pingRTT(@S,D,RTT) :- pongMsg(@S), pendingPing(@S,D,T), RTT = f_now() - T. pp6 #link(@S,D) :- pingRTT(@S,D,RTT). Query pingRTT(@S,D,RTT). 4 Dropping Location Specifier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #link(S,D) #link(Source,Destination) pendingPing(S,D) pendingPing(Source,Destination,Time) pingRTT(S,D,RTT) pingRTT(Source,Destination,RoundTripTime) events: ping(S,D) ping(Source,Destination) pingMsg(S,D) pingMsg(Source,Destination) pongMsg(S) pongMsg(Source) periodic (S,5) pp1 ping(S,D) :- periodic(S,5), #link(S, D). pp2 pingMsg(S,D) :- ping(S,D), #link(S,D). pp3 pendingPing(S,D,T) :- ping(S,D), T = f_now(). pp4 pongMsg(S) :- pingMsg(S,D), #link(D,S). pp5 pingRTT(S,D,RTT) :- pongMsg(S), pendingPing(S,D,T), RTT = f_now() - T. pp6 #link(S,D) :- pingRTT(S,D,RTT). Query pingRTT(S,D,RTT). 5 NDlog programs with soft-state -> STANDARD NDlog programs ~~ EMBED Soft-State with Time Attribute ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ soft-state: link(S,D,Tc,Tl) link(Source,Destination, Tc, Tl) pendingPing(S,D,T,Tc,Tl) pendingPing(Source,Destination,Time,CurrentTime, LifeTime) pingRTT(S,D,RTT) pingRTT(Source,Destination,RoundTripTime,CurrentTime, LifeTime) (Tl=10, from materialize declaration) events: ping(S,D,Tc) ping(Source,Destination, CurrentTime) pingMsg(S,D,Tc) pingMsg(Source,Destination, CurrentTime) pongMsg(S, Tc) pongMsg(Source, CurrentTime) periodic (S,5,Tc) pr periodic(S, 5, Tc') :- periodic(S, 5, Tc), Tc' = Tc+5 pp1 ping(S,D,Tc) :- periodic(S,5,Tc), link(S,D,Tc',10), Tc' < Tc < Tc' + 10. pp2 pingMsg(S,D,Tc) :- ping(S,D,Tc), link(S,D, Tc', 10) Tc' < Tc < Tc' + 10. pp3 pendingPing(S,D,T,Tc,10) :- ping(S,D,Tc), T = f_now(). pp4 pongMsg(S,Tc) :- pingMsg(S,D,Tc), link(D,S,Tc',10), Tc' < Tc < Tc' + 10. pp5 pingRTT(S,D,RTT,Tc,10) :- pongMsg(S,Tc), pendingPing(S,D,T, Tc',10), RTT = f_now() - T, Tc' < Tc < Tc' + 10. pp6 link(S,D,Tc,10) :- pingRTT(S,D,RTT,Tc,10). Query pingRTT(S,D,RTT).