For many years, there has been a little-used capability in ADL which enables basic expressions to be stated such as the following in the Apgar Observation archetype:

*rules*

/score_sum/: /data[id3]/events[id4]/data[id2]/items[id26]/value[id44]/magnitude = /data[id3]/events[id4]/data[id2]/items[id6]/value[id40]/value + /data[id3]/events[id4]/data[id2]/items[id10]/value[id39]/value + /data[id3]/events[id4]/data[id2]/items[id14]/value[id41]/value + /data[id3]/events[id4]/data[id2]/items[id18]/value[id42]/value + /data[id3]/events[id4]/data[id2]/items[id22]/value[id43]/value

where all those paths point to the various Apgar leaf data values, i.e. total, heart rate etc.

This kind of statement is intended to assert that the total value = the sum of the 5 elements, as per the Apgar formula. However, it was never that clear that it is an assertion, not a value-setting formula, which might also be something we want.

It's also not very readable, even if the paths were rendered with a tool, they are long and painful to read.

Another kind of assertion was to for conditional mandation of some part of the data depending on some other data element (or more generally, an expression), e.g.

*rules*

/data[id2]/items[id21]/items[id15]/value[id50]/defining_code *matches *{[at19]} *implies exists */data[id2]/items[id21]/items[id20]

Here the logical intention is to mandate that the data at the second path, which is about details of transfer (i.e. discharge to other care) if the value of the datum at the first path, which is 'type of separation' = at19|transfer|. Other examples are mandating data containing details of tobacco use if the value of the data item 'tobacco use' /= at44|non-user|.

This also is not that easy to read, or clear in its intentions.

More recently, as part of the development of a simple expression language that can be used across openEHR (archetypes, Task Planning, GDL etc), I proposed some key improvements to expressions in archetypes, namely:

 * symbolic names for paths, done by bindings
 * an explicit 'check' instruction to make the intention of assertion
   clearer
 * a defined() predicate to replace the use of 'exists'

Examples of how these changes look are shown here in the working copy of the ADL2 spec <https://specifications.openehr.org/releases/AM/latest/ADL2.html#_rules_section>. In this form, the above Apgar example becomes:

*rules*
*check *$apgar_total_value = $apgar_heartrate_value + $apgar_breathing_value + $apgar_reflex_value + $apgar_muscle_value + $apgar_colour_value

*data_bindings*

    content_bindings = <
        ["apgar_breathing_value"] = <"/data[id3]/events[id4]/data[id2]/items[id10]/value[id39]/value">         ["apgar_heartrate_value"] = <"/data[id3]/events[id4]/data[id2]/items[id6]/value[id40]/value">         ["apgar_muscle_value"] = <"/data[id3]/events[id4]/data[id2]/items[id14]/value[id41]/value">         ["apgar_reflex_value"] = <"/data[id3]/events[id4]/data[id2]/items[id18]/value[id42]/value">         ["apgar_colour_value"] = <"/data[id3]/events[id4]/data[id2]/items[id22]/value[id43]/value">         ["apgar_total_value"] = <"/data[id3]/events[id4]/data[id2]/items[id26]/value[id44]/magnitude">
    >

And the smoking example is:

*check *$is_smoker = *True **implies **defined *($smoking_details)

Note that this does not address the possible requirement of being able to state a formula that /sets /a field, or defines a purely computed value at a path.

We are still working on details of the expression language, variable binding idea and so on. I am interested in feedback on the approach shown in the spec, preferably provided here in the first instance.

- thomas

_______________________________________________
openEHR-technical mailing list
openEHR-technical@lists.openehr.org
http://lists.openehr.org/mailman/listinfo/openehr-technical_lists.openehr.org

Reply via email to