- From: Pierre-Antoine Champin <pierre-antoine.champin@ercim.eu>
- Date: Mon, 15 Nov 2021 13:32:58 +0100
- To: Dörthe Arndt <doerthe.arndt@ugent.be>, Jos De Roo <josderoo@gmail.com>
- Cc: "public-n3-dev@w3.org" <public-n3-dev@w3.org>
- Message-ID: <f0008f47-bd2f-65b4-cbf1-bf3876127b01@ercim.eu>
On 10/11/2021 17:10, Dörthe Arndt wrote:
> Dear Pierre-Antoine,
>
> Thank you for your proposal. For a draft it is very well readable. I
> was very much looking forward for our virtual „semantics-ping-pong“,
> so let’s get started :) (and hopefully get a nice theory out)
>
> Some basic questions to better understand:
>
>
> * Definition of the Interpretation (page 2): I guess there is a typo
> in the definition of \Delta_I since you somehow claim that the set
> is its own power-set (which can’t be). So, do you mean that any
> tuple of elements of IRI \cup Literal \cup Variable is in
> \Delta_I, or what do you actually mean?
>
No I really meant tuples of element of \Delta_I (because elements of
lists can be lists themselves). And I don't think that this amounts to
say that \Delta_I is its own powerset, mostly because I consider that
tuples (unlike subsets) are always finite (although this might need to
be more explicit).
> * Application of I (page 3): I guess it should be x\in img(Q_I)
> instead of x\in img(Q^{-1}_{I})?
>
Indeed!
>
> * How is Q^{-1}_I(\Gamma_T(x)) is x is a graph defined? I guess we
> simply replace all occurrences of variables by their \Gamma_T(x)?
>
It is defined in the last line of p.3, for any function \gamma
(lowercase): Variable → Term.
>
> * Do you separate log:implies from „normal“ predicates?
>
> * Otherwise we could get problems with the variables in the rules
>
> Example: Let us assume that the following fact holds:
>
> :tweety :can :fly.
>
> That means that also the rule: {:tweety a :penguin.}=>{:tweety
> :can :fly.}. (simply because tweety can fly anyway)
>
> * So, if we had a rule {?x a :penguin.}=>{?x :can :fly.}. we could
> make that true with\Gamma(?x)=(D_I(:tweety), :tweety),
> (D_I(:tweety), D_I(:can), D_I(:fly))\in EXT_I and
> (Q^{-1}_I(\Gamma_T({ ?x a :penguin })), D_I(log:implies),
> Q^{-1}_I(\Gamma_T({ ?x :can :fly })))=(Q^{-1}_I({:tweety a
> :penguin })), D_I(log:implies), Q^{-1}_I(({ :tweety :can :fly
> })))\in EXT_I In that case the rule should not fire on :midas a
> :penguin. and not derive that :midas :can :fly. But in my
> understanding we still have a valid interpretation here, so what
> am I missing?
>
Let me try to summarize the problem you see here:
:tweety :can :fly.
|=
:tweety :can :fly.
{ :tweety a :penguin } => { :tweety :can :fly }.
|=
?x :can :fly.
{ ?x a :penguin } => { ?x :can :fly }.
Is that it?
I believe the first entailment does not hold. I can construct a model
for the 1st graph that is not a model of the 2nd graph:
\Delta_I = { T, C, F } U { all tuples generated with T, C and F }
Q_I = empty set
V_I = empty set
D_I maps T to :tweety, C to :can and F to :fly
EXT_I = { (T, C, F) }
This interpretation trivially satisfies the semantic condition of
rule-interpretations (no triple in EXT_I has D_I(log:implies) in the 2nd
position).
--
The 2nd entailment, on the other hand, holds, and I agree this is a big
problem :-(
More precisely, what we have is
:markus a :penguin.
:tweety :can :fly.
{ :tweety a :penguin } => { :tweety :can :fly }.
|=
:markus a :penguin.
?x :can :fly.
{ ?x a :penguin } => { ?x :can :fly }.
From this, it would seem that we must infer that :markus :can :fly.
That would be a problem (as it is clearly not the intent of the first
graph), but the problem is actually elsewehere. There exists a model of
the 2nd graph (e.g. the Herbrand model of the 1st one) in which :markus
can not fly. So ":markus :can :fly" is not entailed by the first graph
(which is ok) but not entailed either by the 2nd one either (which is a
problem). So rule-entailment actually fails to capture the semantics of
rules :-(
Thanks for pointing that out. This is a bit frustrating, but that's
progress ;-)
> I did not enough time to look into your proposal yet, so I apologize
> if my questions are too simple. You will get more elaborate questions
> later (most likely after me biking home since I need to think it
> through ;) ).
>
> Ah, one additional remark: did you consider how we align with RDF?
> Because that RDF alignment with my reason to not go for a semantics
> with explicit quantification in the first place. I am still wondering
> whether we should do that instead since it would simplify things a lot
> (we might even go towards FOL if we are already on that track).
I believe that, for the subset of N3 graphs that are also RDF graphs,
the proposed interpretations are effectively equivalent to Simple
Interpretations...
best
>
> Kind regards and expect my follow-up mail :)
> Dörthe
>
>> Am 09.11.2021 um 23:05 schrieb Jos De Roo <josderoo@gmail.com>:
>>
>> Hi Pierre-Antoine,
>>
>> Thank you very much, it makes a lot of sense and I really like it!
>>
>> I am also happy that we could then drop Skolem IRIs in EYE ;-)
>>
>> Currently EYE seems to be happy with the examples except for the
>> pathological one which does not work due to a variable predicate
>> issue but http://ppr.cs.dal.ca:3002/n3/editor/s/zEiNj22t works :-)
>>
>> Jos
>>
>> -- https://josd.github.io
>>
>>
>> On Tue, Nov 9, 2021 at 10:13 PM Pierre-Antoine Champin
>> <pierre-antoine@w3.org> wrote:
>>
>> Hi all,
>>
>> as discussed during yesterday's call, here is the new proposal
>> for N3's semantics that I have been working on. Rather than
>> delaying the discussion until I find the time to put everything
>> in a proper document, here is a link to my scribbling, hoping
>> that it will be legible enough.
>>
>> https://h.champin.net/nextcloud/index.php/s/QR9pxs96daamFoo/download
>>
>> Below is a high level summary of the proposal, followed by some
>> discussions and examples not present in the PDF. Apologies in
>> advance for a long email.
>>
>>
>> Executive summary
>>
>> N3 graphs are now made of IRIs, Literals and Variables. Variables
>> are not intrinsically quantified -- their quantification (and the
>> associated scope) is determined by their use.
>>
>> * by default, they are considered as existentially quantified,
>> just like blank nodes in RDF (simple interpretations, p2 in the
>> PDF) -- actually, variables occurring /only/ in quoted graphs are
>> more like free variables than existentials.
>>
>> * log:implies "interprets" the variables in its subject graphs as
>> universally quantified. Variables that occur only in the object
>> graph are considered as local existentials. This is captured by a
>> semantic extension ("rule interpretation", p7 of the PDF)
>>
>> * other builtins (e.g. e:forAll) may interpret variables in their
>> subject and object in yet other ways, captured by additional
>> semantic extensions (I have not worked on that yet)
>>
>> This "schizophenia" of variables can have strange effects in a
>> few corner cases (illustrated below), but my intuition is that
>> those are exotic enough to not be a problem in practice.
>>
>> Variables in concrete syntaxes can be represented by quick vars
>> (?x), blank node labels (_:x) or anons ([...]). I would suggest
>> that _:x and ?x are considered as different variables. This
>> becomes important in the last section of this email.
>>
>>
>> Variables in facts / variables in rules
>>
>> Consider the following graph, where the variable _:b1 occurs both
>> at the top level and in a quoted graph.
>>
>> :alice :mother _:b1 .
>> :alice :says { _:b1 a :NicePerson }.
>> :bob :mother _:b2.
>> :bob :says { _:b3 a :NicePerson }.
>> { _:x :mother _:y; :says { _:y a :NicePerson } } => { :answer
>> :is _:x }.
>>
>> This would give answer :alice → a variable in quoted graphs
>> "corefers" with the same variable outside any quoted graph.
>> However, variables in rules are treated differently:
>>
>> :alice a :Woman; :mother _:x.
>> :alice :says { _:x a :NicePerson }.
>> { _:x a :Woman } => { _:x a :Person }.
>>
>> |=
>>
>> :alice a :Woman.
>>
>> When the rule is fired, _:x is no longer considered as referring
>> to Alice's mother, but as a universal variable, which can be
>> bound to anything matching the condition (in that case, :alice).
>>
>> Note that the same happens with my previous proposal (adopted by
>> Dörthe yesterday, and implemented in EYE) → _:x in a rule is not
>> the same as _:x outside a rule (although there are also subtle
>> differences).
>>
>> A consequence is that only named resources (i.e. IRIs and
>> Literals) can be directly referred to by rules. One can look at
>> it as if rules operated from "outside" the graph on which they
>> are applied. Similarly, in the example above, another file can
>> refer to :alice, but not to her mother.
>>
>>
>> Dörthe's example 1
>>
>> {_:x a :Penguin}=>{_:x a :Bird}.
>> {_:y =>_:z}=>{_:y a :Premise. _:z a :Conclusion }.
>>
>> |=
>>
>> {_:x a :Penguin} a :Premise.
>> {_:x a :Bird} a :Conclusion.
>>
>> Here, when the second rule is fired, _:y and _:z are interpreted
>> as universals (and matched against the two quoted graph), but _:x
>> in this context is just a free variable inside a quoted graph.
>>
>>
>> Dörthe's example 2
>>
>> _:x a :Penguin.
>> :bob :thinks {_:x a :Bird}.
>> {:bob :thinks _:y}=>{{:bob :is :wise}=>_:y}.
>>
>> |=
>>
>> {:bob :is :wise} => {_:x a :Bird}.
>>
>> My understanding of this example is that, if we further know that
>> :bob :is :wise, then we would like to conclude that Bob's thought
>> is true, i.e. that /the penguin _:x/ is indeed a :Bird.
>> Unfortunately, this is not what happens in this new proposal.
>> Just as in the example of Alice's mother above, the _:x in the
>> newly generated rule will not be related to the penguin _:x when
>> the rule is fired. Instead, a new blank node would be generated.
>>
>>
>> Pathological example
>>
>> _:x a :Unicorn.
>> { _:x a :Cat } => { _:x a :Animal }.
>> { { _:s _:p _:o }=>_:c } => { _:s a :RuleSubject }.
>>
>> |=
>>
>> _:x a :RuleSubject, # derived from the rule above
>> :Unicorn. # was alteady present in the graph
>>
>> Here, it might be surprising that the _:x at the top level
>> (referring to some unicorn) gets mixed with the _;x in the rule
>> body (matching any cat). Didn't we say above that variables in
>> rules are independent from their use outside the rule?
>>
>> In fact, they are different only when the rule is fired. Here,
>> the 2nd rule is fired, and its premise matches the 2nd triple of
>> the graph, which has predicate log:implies but is not being used
>> as a rule right now. So its subject and object are simple quoted
>> graphs, with their variables "able to corefer" with variables at
>> the top level.
>>
>> I would argue that this example is pathological because there is
>> not good reason to use the same variable in the rule and in some
>> facts. It is allowed, it "works": the 2nd rule would fire
>> correctly if we added ":felix a :Cat." in the graph, for
>> example. But it has no added value compared to using a distinct
>> variable.
>>
>> Encouraging people to use blank node labels only in facts, and
>> quick vars only in rules, should keep them away from this kind of
>> pathological examples. And since currently people do it because
>> they /have/ to, this looks like a reasonable guideline.
>>
>> _:x a :Unicorn.
>> { ?x a :Cat } => { ?x a :Animal }.
>> { { ?s ?p ?o }=> ?c } => { ?s a :RuleSubject }.
>>
>> |=
>>
>> ?x a :RuleSubject. # is derived
>> _:x a :Unicorn. # _:x the unicorn is a *different* variable
>>
>>
>> That's all follks. Thanks for reading all this! Hope it makes
>> some sense.
>>
>> pa
>>
>
Attachments
- application/pgp-keys attachment: OpenPGP public key
Received on Monday, 15 November 2021 12:33:06 UTC