Skip to content

Commit cff3fb2

Browse files
committed
addresses #228 in Sec.18.5 'Property Path Patterns', and addresses #218
1 parent 74b1f52 commit cff3fb2

File tree

1 file changed

+105
-95
lines changed

1 file changed

+105
-95
lines changed

spec/index.html

Lines changed: 105 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -9686,14 +9686,18 @@ <h4>Treatment of Blank Nodes</h4>
96869686
<section id="PropertyPathPatterns">
96879687
<h3>Property Path Patterns</h3>
96889688
<p>This section defines the evaluation of <a href="#defn_PropertyPathPattern">property path
9689-
patterns</a>. A property path pattern is a subject endpoint (an RDF term or a variable), a
9690-
<a href="#defn_PropertyPathExpr">property path expression</a>, and an object endpoint. The
9691-
<a href="#sparqlTranslatePathExpressions">translation of property path expressions</a> converts every
9692-
<a href="#defn_PropertyPathExpr">property path expression</a> into an
9693-
<a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a>.
9694-
Thereafter, <a href="#sparqlTranslatePathPatterns">translation of property path pattern</a> converts
9695-
some of these algebraic property path expressions
9696-
to other SPARQL graph pattern, such as converting property paths of length one to triple
9689+
patterns</a>. A property path pattern consists of a subject endpoint (an RDF term or a variable), a
9690+
<a href="#defn_PropertyPathExpr">property path expression</a>, and an object endpoint.</p>
9691+
<p>The <a href="#sparqlTranslatePathExpressions">translation of property path expressions</a>
9692+
converts every <a href="#defn_PropertyPathExpr">property path expression</a>
9693+
into an <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a>.
9694+
For example, the property path expression <code>(:p/:q)*</code>
9695+
is a ZeroOrMorePath expression involving a sequence property path,
9696+
and is translated into the algebraic property path expression
9697+
<a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>( <a href="#defn_ppeSeq" class="ppeOp">seq</a>(<a href="#defn_ppeLink" class="ppeOp">link</a>(:p), <a href="#defn_ppeLink" class="ppeOp">link</a>(:q)) ).</p>
9698+
<p>Thereafter, the <a href="#sparqlTranslatePathPatterns">translation of property path patterns</a>
9699+
converts some of these algebraic property path expressions
9700+
to other SPARQL graph patterns, such as converting property paths of length one to triple
96979701
patterns, which in turn are combined into basic graph patterns.
96989702
This leaves algebraic property path expressions with the operators
96999703
<a href="#defn_ppeZeroOrOnePath" class="ppeOp">ZeroOrOnePath</a>,
@@ -9704,12 +9708,7 @@ <h3>Property Path Patterns</h3>
97049708
expressions contained within these operators.</p>
97059709
<p>The property path patterns with these remaining algebraic property path expressions
97069710
are present in the <a href="#algebraicSyntax">algebraic syntax</a> in the form
9707-
<a href="#defn_absPath" class="absOp">Path</a>(|X|, |ppe|, |X|) for endpoints |X| and |Y|.
9708-
For example, the <a href="#defn_PropertyPathExpr">property path expression</a> <code>(:p/:q)*</code>
9709-
is a ZeroOrMorePath expression involving a sequence property path,
9710-
and is translated into the algebraic property path expression
9711-
<a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>( <a href="#defn_ppeSeq" class="ppeOp">seq</a>(<a href="#defn_ppeLink" class="ppeOp">link</a>(:p), <a href="#defn_ppeLink" class="ppeOp">link</a>(:q)) ).</p>
9712-
<div class="ednote">The example at the end of the previous paragraph fits much better into the first paragraph of the section and, thus, should be moved there.</div>
9711+
<a href="#defn_absPath" class="absOp">Path</a>(|X|, |ppe|, |X|) for endpoints |X| and |Y|.</p>
97139712
<div class="defn">
97149713
<div id="pp-eval-notation">
97159714
<b>Notation</b>
@@ -9776,139 +9775,150 @@ <h3>Property Path Patterns</h3>
97769775
<p>where |PV| = { |v| ∈ {|X|,|Y|} | |v| is a variable}.</p>
97779776
<div class="issue" data-number="266"><a href="#defn_algJoin" class="algFct">Join</a> produces a multiset of solution mappings but <a href="#defn_algProject" class="algFct">Project</a> expects a sequence as its first argument. Moreover, <a href="#defn_algProject" class="algFct">Project</a> produces a sequence but ppeval(..) should be a multiset.</div>
97789777
</div>
9779-
<div class="ednote">Olaf, continue here!</div>
97809778
<p>Informally, this is the same as:</p>
9781-
<pre>SELECT * { X P _:a . _:a Q Y }</pre>
9782-
<p>using the fact that a blank node <code>_:a</code> acts like a variable (under simple
9779+
<pre class="nohighlight">SELECT * { <var>X</var> <var>P<sub>1</sub></var> _:a . _:a <var>P<sub>2</sub></var> <var>Y</var> }</pre>
9780+
<p>where <var>P<sub>1</sub></var> is a
9781+
<a href="#defn_AlgebraicPropertyPathExpression">property path expression</a>
9782+
that can be <a href="#sparqlTranslatePathExpressions">translated</a> into the
9783+
<a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a> <var>ppe<sub>1</sub></var>
9784+
and <var>P<sub>2</sub></var> can be translated into <var>ppe<sub>2</sub></var>.
9785+
This observation is based on the fact that a blank node <code>_:a</code> acts like a variable (under simple
97839786
entailment) except it does not appear in the results from <code>SELECT *</code>.</p>
97849787
<div class="defn">
97859788
<p><b>Definition: <span id="defn_evalPP_alternative">Evaluation of Alternative Property Path</span></b></p>
9786-
<p>Let P and Q be property path expressions.</p>
9787-
<pre>
9788-
eval(Path(X, alt(P,Q), Y)) =
9789-
Union(eval(Path(X, P, Y)), eval(Path(X, Q, Y)))
9789+
<p>Let <var>ppe<sub>1</sub></var> and <var>ppe<sub>2</sub></var> be <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expressions</a>.
9790+
<pre class="nohighlight">
9791+
ppeval(<var>X</var>, <a href="#defn_ppeAlt" class="ppeOp">alt</a>(<var>ppe<sub>1</sub></var>,<var>ppe<sub>2</sub></var>), <var>Y</var>) =
9792+
<a href="#defn_algUnion" class="algFct">Union</a>( ppeval(<var>X</var>, <var>ppe<sub>1</sub></var>, <var>Y</var>), ppeval(<var>X</var>, <var>ppe<sub>2</sub></var>, <var>Y</var>) )
97909793
</pre>
97919794
</div>
97929795
<p>Informally, this is the same as:</p>
9793-
<pre>SELECT * { { X P Y } UNION { X Q Y } }</pre>
9796+
<pre class="nohighlight">SELECT * { { <var>X</var> <var>P<sub>1</sub></var> <var>Y</var> } UNION { <var>X</var> <var>P<sub>2</sub></var> <var>Y</var> } }</pre>
9797+
<p>where <var>P<sub>1</sub></var> is a
9798+
<a href="#defn_AlgebraicPropertyPathExpression">property path expression</a>
9799+
that can be <a href="#sparqlTranslatePathExpressions">translated</a> into the
9800+
<a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a> <var>ppe<sub>1</sub></var>
9801+
and <var>P<sub>2</sub></var> can be translated into <var>ppe<sub>2</sub></var>.</p>
97949802
<div class="defn">
97959803
<p><b>Definition: <span id="defn_nodeSet">Node set of a graph</span></b></p>
9796-
<p>The node set of a graph G, nodes(G), is:</p>
9797-
<p>nodes(G) = { n | n is an RDF term that is used as a subject or object of a triple of
9798-
G}</p>
9804+
<p>The node set of a graph |G|, <a href="#defn_nodeSet">nodes</a>(|G|), is:</p>
9805+
<p><a href="#defn_nodeSet">nodes</a>(|G|) = { |n| | |n| is an RDF term that is used as a subject or object of a triple of
9806+
|G|}</p>
97999807
</div>
98009808
<div class="defn">
98019809
<p><b>Definition: <span id="defn_evalPP_ZeroOrOnePath">Evaluation of ZeroOrOnePath</span></b></p>
9802-
<pre>
9803-
eval(Path(X:term, ZeroOrOnePath(P), Y:var)) =
9804-
{ (Y, yn) | yn = X or {(Y, yn)} in eval(Path(X,P,Y)) }
9810+
<p>Let |ppe| be an <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a>.
9811+
Let <var>G</var> be the <a href="#defn_ActiveGraph">active graph</a>.</p>
9812+
<pre class="nohighlight">
9813+
ppeval(<var>X</var>:term, <a href="#defn_ppeZeroOrOnePath" class="ppeOp">ZeroOrOnePath</a>(<var>ppe</var>), <var>Y</var>:var) =
9814+
{ (<var>Y</var>, <var>yn</var>) | <var>yn</var> = <var>X</var> or {(<var>Y</var>, <var>yn</var>)} in ppeval(<var>X</var>,<var>ppe</var>,<var>Y</var>) }
98059815
</pre>
9806-
<pre>
9807-
eval(Path(X:var, ZeroOrOnePath(P), Y:term)) =
9808-
{ (X, xn) | xn = Y or {(X, xn)} in eval(Path(X,P,Y)) }
9816+
<pre class="nohighlight">
9817+
ppeval(<var>X</var>:var, <a href="#defn_ppeZeroOrOnePath" class="ppeOp">ZeroOrOnePath</a>(<var>ppe</var>), <var>Y</var>:term) =
9818+
{ (<var>X</var>, <var>xn</var>) | <var>xn</var> = <var>Y</var> or {(<var>X</var>, <var>xn</var>)} in ppeval(<var>X</var>,<var>ppe</var>,<var>Y</var>) }
98099819
</pre>
9810-
<pre>
9811-
eval(Path(X:term, ZeroOrOnePath(P), Y:term)) =
9812-
{ {} } if X = Y or eval(Path(X,P,Y)) is not empty
9813-
{ } othewise</pre>
9814-
<pre>
9815-
eval(Path(X:var, ZeroOrOnePath(P), Y:var)) =
9816-
{ (X, xn) (Y, yn) | either (yn in nodes(G) and xn = yn) or {(X,xn), (Y,yn)} in eval(Path(X,P,Y)) }</pre>
9820+
<pre class="nohighlight">
9821+
ppeval(<var>X</var>:term, <a href="#defn_ppeZeroOrOnePath" class="ppeOp">ZeroOrOnePath</a>(<var>ppe</var>), <var>Y</var>:term) =
9822+
{ {} } if <var>X</var> = <var>Y</var> or ppeval(<var>X</var>,<var>ppe</var>,<var>X</var>) is not empty
9823+
{ } otherwise</pre>
9824+
<pre class="nohighlight">
9825+
ppeval(<var>X</var>:var, <a href="#defn_ppeZeroOrOnePath" class="ppeOp">ZeroOrOnePath</a>(<var>ppe</var>), <var>Y</var>:var) =
9826+
{ (<var>X</var>, <var>xn</var>) (<var>Y</var>, <var>yn</var>) | either (<var>yn</var> in <a href="#defn_nodeSet">nodes</a>(<var>G</var>) and <var>xn</var> = <var>yn</var>) or {(<var>X</var>,<var>xn</var>), (<var>Y</var>,<var>yn</var>)} in ppeval(<var>X</var>,<var>ppe</var>,<var>Y</var>) }</pre>
98179827
</div>
9818-
<p>We define an auxillary function, ALP, used in the definitions of ZeroOrMorePath and
9819-
OneOrMorePath. Note that the algorithm given here serves to specify the feature. An
9828+
<p>We define an auxiliary function, <a href="#defn_evalALP_1">ALP</a>, used in the definitions of <a href="#defn_evalZeroOrMorePath">ZeroOrMorePath</a> and
9829+
<a href="#defn_evalOneOrMorePath">OneOrMorePath</a>. Note that the algorithm given here serves to specify the feature. An
98209830
implementation is free to implement evaluation by any method that produces the same results
9821-
for the query overall. The ZeroOrMorePath and OneOrMorePath forms return matches based on
9831+
for the query overall. The <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a> and <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a> forms return matches based on
98229832
distinct nodes connected by the path.</p>
98239833
<p>The matching algorithm is based on following all paths, and detecting when a graph node
98249834
(subject or object), has been already visited on the path.</p>
98259835
<p>Informally, this algorithm attempts to extend the multiset of results by one application
9826-
of <code>path</code> at each step, noting which nodes it has visited for this particular path. If
9836+
of the given <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a> |ppe| at each step, noting which nodes it has visited for this particular path. If
98279837
a node has been visited for the path under consideration, it is not a candidate for another
98289838
step.</p>
98299839
<div class="defn">
98309840
<p><b>Definition: <span id="defn_evalALP_1">Function ALP</span></b></p>
9831-
<pre>
9832-
Let eval(x:term, path) be the evaluation of 'path', starting at RDF term x,
9841+
<pre class="nohighlight">
9842+
Let <var>ppe</var> be an <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a>.
9843+
Let <var>eval</var>(<var>x</var>:term, <var>ppe</var>) be the evaluation of <var>ppe</var>, starting at RDF term <var>x</var>,
98339844
and returning a multiset of RDF terms reached
9834-
by repeated matches of path.
9845+
by repeated matches of <var>ppe</var>.
98359846

9836-
ALP(x:term, path) =
9837-
Let V = empty set
9838-
ALP(x:term, path, V)
9839-
return is V
9847+
<a href="#defn_evalALP_1">ALP</a>(<var>x</var>:term, <var>ppe</var>) =
9848+
Let <var>V</var> = empty set
9849+
<a href="#defn_evalALP_1">ALP</a>(<var>x</var>:term, <var>ppe</var>, <var>V</var>)
9850+
return is <var>V</var>
98409851

9841-
# V is the set of nodes visited
9852+
# <var>V</var> is the set of nodes visited
98429853

9843-
ALP(x:term, path, V:set of RDF terms) =
9844-
if ( x in V ) return
9845-
add x to V
9846-
X = eval(x,path)
9847-
For n:term in X
9848-
ALP(n, path, V)
9854+
<a href="#defn_evalALP_1">ALP</a>(<var>x</var>:term, <var>ppe</var>, <var>V</var>:set of RDF terms) =
9855+
if ( <var>x</var> in <var>V</var> ) return
9856+
add <var>x</var> to <var>V</var>
9857+
<var>X</var> = <var>eval</var>(<var>x</var>, <var>ppe</var>)
9858+
For <var>n</var>:term in <var>X</var>
9859+
<a href="#defn_evalALP_1">ALP</a>(<var>n</var>, <var>ppe</var>, <var>V</var>)
98499860
End
98509861
</pre>
98519862
</div>
98529863
<div class="defn">
9853-
<p><b>Definition: Evaluation of</b></p>
9854-
<div id="defn_evalZeroOrMorePath">
9855-
<b>ZeroOrMorePath</b>
9856-
</div>
9857-
<pre>
9858-
eval(Path(X:term, ZeroOrMorePath(path), vy:var)) =
9859-
{ { (vy, n) } | n in ALP(X, path) }
9864+
<p><b>Definition: <span id="defn_evalZeroOrMorePath">Evaluation of ZeroOrMorePath</span></b></p>
9865+
<p>Let <var>ppe</var> be an <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a>.
9866+
Let <var>G</var> be the <a href="#defn_ActiveGraph">active graph</a>.</p>
9867+
<pre class="nohighlight">
9868+
ppeval(<var>X</var>:term, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<var>ppe</var>), <var>vy</var>:var) =
9869+
{ { (<var>vy</var>, <var>n</var>) } | <var>n</var> in <a href="#defn_evalALP_1">ALP</a>(<var>X</var>, <var>ppe</var>) }
98609870

9861-
eval(Path(vx:var, ZeroOrMorePath(path), vy:var)) =
9862-
{ { (vx, t), (vy, n) } | t in nodes(G), (vy, n) in eval(Path(t, ZeroOrMorePath(path), vy)) }
9871+
ppeval(<var>vx</var>:var, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<var>ppe</var>), <var>vy</var>:var) =
9872+
{ { (<var>vx</var>, <var>t</var>), (<var>vy</var>, <var>n</var>) } | <var>t</var> in <a href="#defn_nodeSet">nodes</a>(<var>G</var>), (<var>vy</var>, <var>n</var>) in ppeval(<var>t</var>, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<var>ppe</var>), <var>vy</var>) }
98639873

9864-
eval(Path(vx:var, ZeroOrMorePath(path), y:term)) =
9865-
eval(Path(y:term, ZeroOrMorePath(inv(path)), vx:var))
9874+
ppeval(<var>vx</var>:var, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<var>ppe</var>), <var>y</var>:term) =
9875+
ppeval(<var>y</var>:term, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<a href="#defn_ppeInv" class="ppeOp">inv</a>(<var>ppe</var>)), <var>vx</var>:var)
98669876

9867-
eval(Path(x:term, ZeroOrMorePath(path), y:term)) =
9868-
{ { } } if { (vy:var,y) } in eval(Path(x, ZeroOrMorePath(path) vy)
9877+
ppeval(<var>x</var>:term, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<var>ppe</var>), <var>y</var>:term) =
9878+
{ { } } if { (<var>vy</var>:var,<var>y</var>) } in ppeval(<var>x</var>, <a href="#defn_ppeZeroOrMorePath" class="ppeOp">ZeroOrMorePath</a>(<var>ppe</var>), <var>vy</var>)
98699879
{ } otherwise
98709880
</pre>
98719881
</div>
98729882
<div class="defn">
9873-
<p><b>Definition: Evaluation of</b></p>
9874-
<div id="defn_evalOneOrMorePath">
9875-
<b>OneOrMorePath</b>
9876-
</div>
9877-
<p>eval(Path(X, OneOrMorePath(path), Y))</p>
9878-
<pre>
9879-
# For OneOrMorePath, we take one step of the path then start
9883+
<p><b>Definition: <span id="defn_evalOneOrMorePath">Evaluation of OneOrMorePath</span></b></p>
9884+
<p>Let <var>ppe</var> be an <a href="#defn_AlgebraicPropertyPathExpression">algebraic property path expression</a>.
9885+
Let <var>G</var> be the <a href="#defn_ActiveGraph">active graph</a>.</p>
9886+
<pre class="nohighlight">
9887+
# For <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>, we take one step of the path then start
98809888
# recording nodes for results.
98819889

9882-
eval(Path(x:term, OneOrMorePath(path), vy:var)) =
9883-
Let X = eval(x, path)
9884-
Let V = the empty multiset
9885-
For n in X
9886-
ALP(n, path, V)
9890+
ppeval(<var>x</var>:term, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<var>ppe</var>), <var>vy</var>:var) =
9891+
Let <var>X</var> = <var>eval</var>(<var>x</var>, <var>ppe</var>)
9892+
Let <var>V</var> = the empty multiset
9893+
For <var>n</var> in <var>X</var>
9894+
<a href="#defn_evalALP_1">ALP</a>(<var>n</var>, <var>ppe</var>, <var>V</var>)
98879895
End
9888-
result is V
9896+
result is <var>V</var>
9897+
<div class="issue" data-number="267"><var>V</var> is not a multiset of solution mappings but a set of RDF terms.</div>
98899898

9890-
eval(Path(vx:var, OneOrMorePath(path), vy:var)) =
9891-
{ { (vx, t), (vy, n) } | t in nodes(G), (vy, n) in eval(Path(t, OneOrMorePath(path), vy)) }
9899+
ppeval(<var>vx</var>:var, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<var>ppe</var>), <var>vy</var>:var) =
9900+
{ { (<var>vx</var>, <var>t</var>), (<var>vy</var>, <var>n</var>) } | <var>t</var> in <a href="#defn_nodeSet">nodes</a>(<var>G</var>), (<var>vy</var>, <var>n</var>) in ppeval(<var>t</var>, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<var>ppe</var>), <var>vy</var>) }
98929901

9893-
eval(Path(vx:var, OneOrMorePath(path), y:term)) =
9894-
eval(Path(y:term, OneOrMorePath(inv(path)), vx))
9902+
ppeval(<var>vx</var>:var, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<var>ppe</var>), <var>y</var>:term) =
9903+
ppeval(<var>y</var>:term, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<a href="#defn_ppeInv" class="ppeOp">inv</a>(<var>ppe</var>)), <var>vx</var>)
98959904

9896-
eval(Path(x:term, OneOrMorePath(path), y:term)) =
9897-
{ { } } if { (vy:var, y) } in eval(Path(x, OneOrMorePath(path), vy))
9905+
ppeval(<var>x</var>:term, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<var>ppe</var>), <var>y</var>:term) =
9906+
{ { } } if { (<var>vy</var>:var, <var>y</var>) } in ppeval(<var>x</var>, <a href="#defn_ppeOneOrMorePath" class="ppeOp">OneOrMorePath</a>(<var>ppe</var>), <var>vy</var>)
98989907
{ } otherwise
98999908
</pre>
99009909
</div>
99019910
<div class="defn">
99029911
<p><b>Definition: <span id="eval_negatedPropertySet">Evaluation of NegatedPropertySet</span></b></p>
9903-
<pre class="code nohighlight">
9904-
Write μ' as the extension of a solution mapping:
9905-
μ'(μ,x) = μ(x) if x is a variable
9906-
μ'(μ,t) = t if t is a RDF term
9912+
<pre class="nohighlight">
9913+
Write <var>μ'</var> as the extension of a solution mapping:
9914+
<var>μ'</var>(<var>μ</var>, <var>x</var>) = <var>μ</var>(<var>x</var>) if <var>x</var> is a variable
9915+
<var>μ'</var>(<var>μ</var>, <var>t</var>) = <var>t</var> if <var>t</var> is a RDF term
99079916
</pre>
9908-
<pre class="code nohighlight">
9909-
Let x and y be variables or RDF terms, and S a set of IRIs:
9917+
<pre class="nohighlight">
9918+
Let <var>x</var> and <var>y</var> be variables or RDF terms, <var>S</var> a set of IRIs,
9919+
and <var>G</var> the <a href="#defn_ActiveGraph">active graph</a>.
99109920

9911-
eval(Path(x, NPS(S), y)) = { μ | ∃ triple(μ'(μ,x), p, μ'(μ,y)) in G, such that the IRI of pS }
9921+
ppeval(<var>x</var>, <a href="#defn_ppeNPS" class="ppeOp">NPS</a>(<var>S</var>), <var>y</var>) = { <var>μ</var> | ∃ triple(<var>μ'</var>(<var>μ</var>,<var>x</var>), <var>p</var>, <var>μ'</var>(<var>μ</var>,<var>y</var>)) in <var>G</var>, such that the IRI of <var>p</var><var>S</var> }
99129922
</pre>
99139923
</div>
99149924
</section>

0 commit comments

Comments
 (0)