Arabic runs right to left. The data should say so.
rdf12-directional-language.js · output · proof · check · try it in the playground
The question
A welcome label exists in Arabic, مرحبا, and in English, Welcome. Arabic
is written right to left, English left to right. RDF 1.2 lets a language
string carry that base direction: "مرحبا"@ar--rtl.
Can a rule derive display labels without losing the direction?
What we tell eyemind
fact(
rdf(iri(ex + 'welcome'), iri(ex + 'label'), literal('مرحبا', lang('ar', 'rtl')), 'default_graph'),
rdf(iri(ex + 'welcome'), iri(ex + 'label'), literal('Welcome', lang('en', 'ltr')), 'default_graph'),
)
implies(rdf(S, iri(ex + 'label'), Label, G), result_rdf(S, iri(ex + 'displayLabel'), Label, G))
RDF values are ordinary terms: iri(Text) for an IRI,
literal(Text, datatype(IRI)) or literal(Text, lang(Tag)) for a literal,
triple(S, P, O) for a triple term, and rdf(S, P, O, Graph) for a quad
in a graph, 'default_graph' or iri(Name). A directional string is literal(Text, lang(Tag, Direction)).
What eyemind concludes
Two display labels, each with its language and direction:
result_rdf(iri('https://example.org/welcome'), iri('https://example.org/displayLabel'), literal('مرحبا', lang('ar', 'rtl')), 'default_graph')
result_rdf(iri('https://example.org/welcome'), iri('https://example.org/displayLabel'), literal('Welcome', lang('en', 'ltr')), 'default_graph')
Why: the proof in plain words
- The Arabic label is right to left — fact 1 — so it is a display label — rule 3.
- The English label is left to right — fact 2 — so it is one too — rule 3.
Each step names the exact line of the program it used, and the values it filled in.
Checked, not just claimed
The proof is a document of its own, and a separate checker reads it against the program. It confirms that every step is an instance of the line it cites, that nothing is assumed the program does not say, that no step depends on itself, and that every step serves one of the results.
Verdict: checked. All 4 steps verified, and nothing taken on trust.
Try it
eyemind examples/rdf12-directional-language.js # the results as quads
eyemind --proof examples/rdf12-directional-language.js # with their proof
eyemind examples/rdf12-directional-language.js > out.js && eyemind-to-rdf out.js -o out.ttl
eyemind-to-rdf and rdf-to-eyemind come with
rdf-interchange;
they turn eyemind’s quads into RDF and RDF into quads.
Or open it in the playground.
Add a Hebrew label, literal('ברוכים הבאים', lang('he', 'rtl')), and run again.
Takeaway
A rule that passes a value on whole cannot lose part of it: the direction arrives on the screen as it left the data.
