W3C home > Mailing lists > Public > public-rif-wg@w3.org > October 2008

[PRD] PICK specification

From: Gary Hallmark <gary.hallmark@oracle.com>
Date: Wed, 15 Oct 2008 23:16:29 -0700
Message-ID: <48F6DC3D.4060403@oracle.com>
To: RIF WG <public-rif-wg@w3.org>

The current specification of PICK in the PRD draft has fallen into 
disrepair.  Here's how I would specify it for OBR/Jess.

Function PICK(order, c) returns a rule instance (ri) or nil.  Order is 
either "FIFO" or "LIFO" to indicate a breadth first or depth first 
search strategy, and c is a Configuration.  If nil is returned, then c 
is a terminal configuration.

We need some helpers:

picked(c) returns the rule instance that was picked when in configuration c.

prior(c, 0) returns c.
prior(c', 1) returns c, where c' is the next configuration after c, as 
given by the overall PRD transition system.
prior(c, age) = prior(prior(c, age - 1), 1)

priority(r) returns a number, where r is a rule. Higher numbers mean 
higher priority.
repeatable(r) returns true or false, where r is a rule.  If false, then 
no instance of r can directly cause another instance of r to fire.

PICK(order, c) is defined as follows. 
First, we construct the agenda relation A(priority, age, ri) where ri is 
a rule instance and the other 2 arguments are numbers.  The tuple 
(priority, age, ri) is in A iff both the following are true:
1. one of the following is true:
    a. repeatable(rule(ri)) is true and age is the greatest i such that 
ri is in prior(c, i) and ri is in prior(c, i-1) and ... and ri is in 
prior(c, 0) and ri != picked(prior(c, i)) and ri != picked(prior(c, 
i-1)) and ... and ri != picked(prior(c, 1)), or
    b. repeatable(rule(ri)) is false and age is the greatest i such that 
ri is in prior(c, i) and ri is in prior(c, i-1) and ... and ri is in 
prior(c, 0) and rule(ri) != rule(picked(prior(c, i))) and rule(ri) != 
rule(picked(prior(c, i-1))) and ... and rule(ri) != rule(picked(prior(c, 
1))), and
2. priority = priority(rule(ri)).
Second, we order A by (priority, age).  We order by decreasing priority, 
then by increasing or decreasing age, depending on whether PICK's order 
argument is LIFO or FIFO, respectively.  Ties are broken arbitrarily.
Finally, we return the ri from the first tuple in A according to the 
ordering.
Received on Thursday, 16 October 2008 06:17:13 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 2 June 2009 18:33:56 GMT