Tobias, thanks for your constructive response.
On 14/06/2012 03:22, Tobias Knerr wrote:
On 13.06.2012 23:48, Colin Smale wrote:
Taking the access discussion to a higher
level of abstraction, and without abandoning the key-value pair
paradigm, I believe we are looking for a way of giving a tag a value
which "depends" on all kinds of "variables". *IMHO* we need a way of
making expressions, with operators to combine basic values in different
ways. These basic values might be literals, other tags, runtime values
or function calls. These functions might be built-in (or assumed) for
the most basic stuff, but it would be good if we could define additional
"user-defined" functions.
Whatever syntax is used, the *primary* requirement is that it is
"usable" by programs - editors, renderers, routers etc. followed by a
secondary requirement that it be understood by humans.
Any condition syntax needs to be parsed by programs, this much we should
all be able to agree on.
As for the secondary requirement, I think that keeping the number of
different basic constructs small can help a lot. The resulting
micro-language can then be easier to read, and also easier to wrap into
a GUI than a language construct that gives the user a lot of freedom.
So when we talk about requirements, we should also consider whether
there are things we _don't_ need.
Fully agree.
And imo there are several, such as:
- "Or" operators. "Maxspeed is 80 if it's wet or Sunday" can be
rephrased as "Maxspeed is 80 if it's wet. Maxspeed is 80 if it's
Sunday." IOW, these can be modelled by using two tags instead of one.
- "Not" operators. These can also modelled by using two tags, and common
tagging idioms like access=no + x=yes even do this already.
- Brackets for expressions. If we limit ourselves to just "and"
operators, evaluation order doesn't matter.
My concern with this is that it may become unwieldy and cumbersome with
anything beyond fairly trivial cases such as your maxspeed example. Then
the debate will erupt again, and PhD's in boolean algebra will point out
that it *can* be done... In the mean time everyone has to learn a new
grammar and mistakes will be made. "and", "or" and "not" are the
building blocks of boolean logic and are easily understood by computers.
For the human audience who can't grasp it yet there are millions of
books and websites. The way it is presented in map editors will be
extremely critical in any case. Also, let's not forget to peek beyond
the boundaries of the current discussion about "access" (i.e. routing)
to see how the conclusion here would fit in other domains.
Here's a test case. No motor vehicles mon-fri between 1600-1800 except
agricultural vehicles and good vehicles *in this direction*. Going the
other way the sign is similar but the times are between 0600 and 0900.
This is a short stretch of narrow road and the restrictions are intended
to stop commuters using it as a rat-run, while at the same time allowing
work to carry on as usual on the farms and businesses along that road.
http://goo.gl/maps/ymvt
motor_vehicle:forward:expr=vehicle_type=="agricultural" ||
vehicle_type=="goods" || weekday == SATURDAY || weekday == SUNDAY ||
time<"16:00"|| time>"18:00"
motor_vehicle:backward:expr=vehicle_type=="agricultural" ||
vehicle_type=="goods" || weekday == SATURDAY || weekday == SUNDAY ||
time<"06:00"|| time>"09:00"
What would this look like using only AND operators?
Pseudo-Javascript: (!is_motor_vehicle(vehicle_type)) ||
((vehicle_type='hgv') && (time<'10:00' || time>'20:00') &&
intention='loading')
So starting from your Pseudo-Javascript example quoted above,
we could get to something like
is_motor_vehicle(vehicle_type) -> no
(vehicle_type='hgv') && (time<'10:00' || time>'20:00') &&
intention='loading') -> yes
It has fewer language constructs, but expresses the same thing - and
still fulfils all the requirements.
Another aspect to consider is that some of the problems we are trying to
solve here have already been tackled elsewhere in OSM. This includes:
- defining a syntax for time intervals (opening_hours)
- defining a subset hierarchy of vehicle categories (such as
"motor_vehicle" including "hgv" as a subset)
Probably it would make sense to re-use these existing building blocks.
This could be done with a small change to the example above:
in_vehicle_category('vehicle_type') -> no
in_vehicle_category('hgv') && in_time_interval('20:00-10:00') &&
intention='loading') -> yes
So how do the existing proposals fit in here? Well, the primary
difference between the example above and "extended conditions" is that
the latter aims for for short, manually editable strings by letting
literals for vehicle classes, weather conditions etc., as well as time
intervals, stand for themselves - based on the assumption that a parser
will be able to unambiguously identify them.
If we chose to do this for our returning example, it might look like this:
motor_vehicle -> no
hgv && 20:00-10:00 && loading -> yes
And that differs from "extended condition" just in superficial details:
motor_vehicle = no
hgv:(20:00-10:00):loading = yes
Maybe this explains some of the motivations behind the current
proposals, and the goals and assumptions and they are based on. Because,
yes, understanding these high-level motivations is a necessary first step.
Tobias
_______________________________________________
Tagging mailing list
Tagging@openstreetmap.org
http://lists.openstreetmap.org/listinfo/tagging
_______________________________________________
Tagging mailing list
Tagging@openstreetmap.org
http://lists.openstreetmap.org/listinfo/tagging