* Added initial draft of semantics and prolog code for generating inferences
authorJames Cheney <jcheney@inf.ed.ac.uk>
Thu, 13 Dec 2012 13:53:35 +0000
changeset 5339 9f5f5c129f60
parent 5337 3acefb686095
child 5340 fc6d8cd2bca5
* Added initial draft of semantics and prolog code for generating inferences
semantics/constraints.pl
semantics/prov-sem.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/semantics/constraints.pl	Thu Dec 13 13:53:35 2012 +0000
@@ -0,0 +1,342 @@
+%% The rules
+%% A decl is of the form
+%% decl(Type,N,Name,Rules)
+%% where Type is Inference or Constraint
+%%       N is the inf/constraint number
+%%       Name is the textual name
+%%       Rules is the body of the rule.
+%% A declaration body is of the form
+%% Body ::= rule(Xs,Hyps,Ys,Concls)
+%%        | comment(Comment,Body)
+%%        | rules([Body1,...,Bodyn])
+%% A rule(Xs,Hyps,Ys,Body) is an implication
+%% forall Xs. Hyps ==> exists Ys. Concls
+%% A comment(Comment,Body) is a body with a surrounding comment
+%% A rules(L) is a list of rules, which will be formatted as a list.
+%% Nested rules() are not guaranteed to work, but comments within list
+%% elements are OK.
+
+
+decl('Inference', 5,'communication-generation-use-inference',
+     rule([id, a_2,a_1,attrs],
+	  [wasInformedBy(id, a_2,a_1,attrs)],
+	  [e, gen, t_1, use, t_2],
+	  [wasGeneratedBy(gen, e,a_1,t_1,[]), used(use, a_2,e,t_2,[])])).
+
+decl('Inference', 6, 'generation-use-communication-inference',
+     rule([gen, a_1, t_1, attrs_1,id_2,a_2,t_2,attrs_2],
+	  [wasGeneratedBy(gen, e,a_1,t_1,attrs_1),
+	   used(id_2, a_2,e,t_2,attrs_2)],
+	  [id],
+	 [wasInformedBy(id, a_2,a_1,[])])).
+
+decl('Inference', 7, 'entity-generation-invalidation-inference',
+     rule([gen, e, a_1, t_1, attrs_1, id_2, a_2, t_2, attrs_2],
+	  [wasGeneratedBy(gen, e,a_1,t_1,attrs_1),
+	   used(id_2, a_2,e,t_2,attrs_2)],
+	  [id],
+	  [wasInformedBy(id, a_2,a_1,[])])).
+
+decl('Inference', 8, 'activity-start-end-inference',
+     rule([a, t_1, t_2, attrs],
+	  [activity(a,t_1,t_2,attrs)],
+	  [start, e_1, a_1, end, a_2, e_2],
+	  [wasStartedBy(start, a,e_1,a_1,t_1,[]),
+	   wasEndedBy(end, a,e_2,a_2,t_2,[])])).
+
+decl('Inference', 9, 'wasStartedBy-inference',
+     rule( [id, a, e_1, a_1, t, attrs],
+	   [wasStartedBy(id, a,e_1,a_1,t,attrs)],
+	   [gen, t_1],
+	   [wasGeneratedBy(gen, e_1,a_1,t_1,[])])).
+
+
+decl('Inference', 10, 'wasEndedBy-inference',
+     rule( [id, a, e_1, a_1, t, attrs],
+	   [wasEndedBy(id, a,e_1,a_1,t,attrs)],
+	   [gen, t_1],
+	   [wasGeneratedBy(gen, e_1,a_1,t_1,[])])).
+
+
+decl('Inference', 11, 'derivation-generation-use-inference',
+     comment('In this inference, none of <math>a</math>, <math>gen_2</math> or <math>use_1</math> can be placeholders -',
+	     rule( [id, e_2, e_1, a, gen_2, use_1, attrs],
+		   [wasDerivedFrom(id, e_2,e_1,a,gen_2,use_1,attrs)],
+		   [s, t_1,t_2 ],
+		   [used(use_1, a,e_1,t_1,[]),
+		    wasGeneratedBy(gen_2, e_2,a,t_2,[])]))).
+    
+
+decl('Inference', 12, 'revision-is-alternate-inference', 
+     comment('In this inference, any of <math>a</math>, <math>g</math> or <math>u</math> may be placeholders.',
+     rule( [id, e_1, e_2, a, g,u],
+	   [wasDerivedFrom(id, e_2,e_1,a,g,u,['prov:type = prov:Revision'])],
+	   [],
+	   [alternateOf(e_2,e_1)]))).
+	 
+decl('Inference', 13, 'attribution-inference',
+     rule([att, e, ag, attrs],
+	  [wasAttributedTo(att, e,ag,attrs)],
+	  [a, t, gen, assoc, pl],
+	  [wasGeneratedBy(gen, e,a,t,[]),
+	   wasAssociatedWith(assoc, a,ag,pl,[])])).
+
+decl('Inference', 14, 'delegation-inference',
+     rule( [id, ag_1, ag_2, a, attrs],
+	   [actedOnBehalfOf(id, ag_1, ag_2, a, attrs)],
+	   [ id_1, pl_1, id_2, pl_2 ],
+	   [wasAssociatedWith(id_1, a, ag_1, pl_1, []),
+	    wasAssociatedWith(id_2, a, ag_2, pl_2, [])])).
+  
+decl('Inference', 15, 'influence-inference',
+     rules([rule( [id, e, a, t, attrs],
+		  [wasGeneratedBy(id, e,a,t,attrs)],
+		  [],
+		  [wasInfluencedBy(id, e, a, attrs)]),
+	    rule( [id, a, e, t, attrs],
+		  [used(id, a,e,t,attrs)],
+		  [],
+		  [wasInfluencedBy(id, a, e, attrs)]),
+	    rule( [id, a_2, a_1, attrs],
+		  [wasInformedBy(id, a_2,a_1,attrs)],
+		  [],
+		  [wasInfluencedBy(id, a_2, a_1, attrs)]),
+	    rule( [id, a_2, e, a_1, t, attrs],
+		  [wasStartedBy(id, a_2,e,a_1,t,attrs)],
+		  [],
+		  [wasInfluencedBy(id, a_2, e, attrs)]),
+	    rule( [id, a_2, e, a_1, t, attrs],
+		  [wasEndedBy(id, a_2,e,a_1,t,attrs)],
+		  [],
+		  [wasInfluencedBy(id, a_2, e, attrs)]),
+	    rule( [id, e, a, t, attrs],
+		  [wasInvalidatedBy(id, e,a,t,attrs)],
+		  [],
+		  [wasInfluencedBy(id, e, a, attrs)]),
+	    rule( [id, e_2, e_1, a, g, u, attrs],
+		  [wasDerivedFrom(id, e_2, e_1, a, g, u, attrs)],
+		  [],
+		  [wasInfluencedBy(id, e_2, e_1, attrs)]),
+	    comment('In this rule, <math>a</math>, <math>g</math>, <math>u</math> may be placeholders -.',
+	    rule( [id, e, ag, attrs],
+		  [wasAttributedTo(id, e,ag,attrs)],
+		  [],
+		  [wasInfluencedBy(id, e, ag, attrs)])),
+	    comment('In this rule, <math>pl</math> may be a placeholder -',
+	    rule( [id, a, ag, pl, attrs],
+		  [wasAssociatedWith(id, a,ag,pl,attrs)],
+		  [],
+		  [wasInfluencedBy(id, a, ag, attrs)])),
+	    rule( [id, ag_2, ag_1, a, attrs],
+		  [actedOnBehalfOf(id, ag_2,ag_1,a,attrs)],
+		  [],
+		  [wasInfluencedBy(id, ag_2, ag_1, attrs)])])).
+
+decl('Inference', 16, 'alternate-reflexive',
+     rule([e],
+	  [entity(e)],
+	  [],
+	  [alternateOf(e,e)])).
+
+decl('Inference', 17, 'alternate-transitive',
+     rule([e_1, e_2, e_3],
+	  [alternateOf(e_1,e_2), alternateOf(e_2,e_3)],
+	  [],
+	  [alternateOf(e_1,e_3)])).
+
+decl('Inference', 18, 'alternate-symmetric',
+     rule([e_1, e_2],
+	  [alternateOf(e_1,e_2)],
+	  [],
+	  [alternateOf(e_2,e_1)])).
+
+decl('Inference', 19, 'specialization-transitive',
+     rule([e_1, e_2, e_3 ],
+	  [specializationOf(e_1,e_2), specializationOf(e_2,e_3)],
+	  [],
+	  [specializationOf(e_1,e_3)])).
+
+decl('Inference', 20, 'specialization-alternate-inference',
+     rule([e_1, e_2],
+      [specializationOf(e_1,e_2)],
+      [],
+      [alternateOf(e_1,e_2)])).
+
+decl('Inference', 21, 'specialization-attributes-inference',
+     rule([e_1, attrs, e_2],
+	  [entity(e_1, attrs), specializationOf(e_2,e_1)],
+	  [],
+	  [entity(e_2, attrs)])).
+
+
+decl('Constraint',56, 'membership-empty-collection',
+     rule([c,e],
+	  [hasMember(c,e),'prov:EmptyCollection \\in typeOf(c)'],
+	  [],
+	  ['False'])).
+
+
+
+
+% rule(vars,hyps,vars,concl)
+
+emit(X,Y,Z) :- atom(X),atom_concat(Y,X,Z).
+emit(X,Y,Z) :- number(X),number_codes(X,Xc),atom_codes(X2,Xc),atom_concat(Y,X2,Z).
+
+emitListSep(_Sep,_Emit,[]) --> [].
+emitListSep(_Sep,Emit,[P]) --> call(Emit,P).
+emitListSep(Sep,Emit,[P,Q|Ps]) -->
+	call(Emit,P),
+	emit(Sep),
+	emitListSep(Sep,Emit,[Q|Ps]).
+
+
+latexPred(A) --> {atom(A)},emit(A).
+latexPred(T) -->
+	{T =.. [F|Ts], Ts \= []},
+	emit(F),
+	emit('('),
+	latexPreds(Ts),
+	emit(')').
+
+latexPreds(Ps) --> emitListSep(',', latexPred, Ps).
+
+latexConj(Ps) --> emitListSep(' \\wedge ', latexPred, Ps).
+
+latexQuantify(_Q,[]) --> [].
+latexQuantify(Q,Xs) --> {Xs \= []},
+	emit(Q),
+	emitListSep(',', emit, Xs),
+	emit('.~').
+
+latexRule(Xs,Hyps,Ys,Concls) -->
+        latexQuantify('\\forall ',Xs),
+	latexConj(Hyps),
+	emit(' \\Longrightarrow '),
+	latexQuantify('\\exists ',Ys),
+	latexConj(Concls).
+
+latexInference(Xs,Hyps,Ys,Concls) -->
+        emit('\\begin{array}[t]{l}\n'),
+	latexQuantify('\\forall ',Xs),
+	latexConj(Hyps),
+	emit('\n\\\\\n\\Longrightarrow\n\\\\\n'),
+	latexQuantify('\\exists ',Ys),
+	latexConj(Concls),
+	emit('\n\\end{array}').
+	
+
+latexRules(rule(Xs,Hyps,Ys,Concls)) -->
+	emit('<math>\n'),
+% Change this to change from logical formula to inference rule format
+	latexRule(Xs,Hyps,Ys,Concls),
+	emit('\n</math>').
+
+latexRules(comment(Comment,Rules)) -->
+	emit(Comment),
+	latexRules(Rules).
+latexRules(rules(L)) -->
+	latexRuleList(L).
+
+% only handles one nesting level
+latexRuleList([]) --> [].
+latexRuleList([R|Rs]) -->
+	emit('\n#'),
+	latexRules(R),
+	latexRuleList(Rs).
+
+latexWiki(Type,Num,Name,Rules) -->
+	emit('=== '),
+	emit(Type),
+	emit(' '),
+	emit(Num),
+	emit(' ('),
+	emit(Name),
+	emit(') ===\n'),
+	latexRules(Rules),
+	emit('\n').
+
+
+
+%% HTML stuff
+
+%% Todo: Recognize subscripts and translate to <sub>
+
+emitVar(A) --> emit(A).
+
+htmlPred(A) --> {atom(A)},
+	emit(A).
+htmlPred(T) -->
+	{T =.. [F|Ts], Ts \= []},
+	emit(F),
+	emit('('),
+	htmlPreds(Ts),
+	emit(')').
+
+htmlPreds(Ps) --> emitListSep(',', htmlPred, Ps).
+
+htmlConj(Ps) --> emitListSep(' &#8743; ', htmlPred, Ps).
+
+htmlQuantify(_Q,[]) --> [].
+htmlQuantify(forall,Xs) --> {Xs \= []},
+	emit('&#8704; '),
+	emitListSep(',', emit, Xs),
+	emit('. ').
+htmlQuantify(exists,Xs) --> {Xs \= []},
+	emit('&#8707; '),
+	emitListSep(',', emit, Xs),
+	emit('. ').
+
+htmlRule(Xs,Hyps,Ys,Concls) -->
+        htmlQuantify(forall,Xs),
+	htmlConj(Hyps),
+	emit(' &#10233; '),
+	htmlQuantify(exists,Ys),
+	htmlConj(Concls).
+
+	
+
+htmlRules(rule(Xs,Hyps,Ys,Concls)) -->
+	emit('<span class="math">'),
+	htmlRule(Xs,Hyps,Ys,Concls),
+	emit('</span>').
+
+htmlRules(comment(Comment,Rules)) -->
+	emit(Comment),
+	htmlRules(Rules).
+htmlRules(rules(L)) -->
+	emit('<ol>'),
+	htmlRuleList(L),
+	emit('</ol>').
+
+% only handles one nesting level
+htmlRuleList([]) --> [].
+htmlRuleList([R|Rs]) -->
+	emit('<li>'),
+	htmlRules(R),
+	emit('</li>'),
+	htmlRuleList(Rs).
+
+htmlWiki('Inference',Num,Name,Rules) -->
+	emit('<div class="inference" id="'),
+	emit(Name),
+	emit('">'),
+	htmlRules(Rules),
+	emit('</div>\n').
+
+
+writeEach(_Out,[]).
+writeEach(Out,[Num|Nums]) :-
+	decl('Inference',Num,Name,Rules),
+	htmlWiki('Inference',Num,Name,Rules,'',X),
+	write(Out,X),
+	flush_output(Out),
+	writeEach(Out,Nums).
+	
+main(F) :- open(F,write,Out),
+        findall(X, decl(_,X,_,_),Xs),
+	writeEach(Out,Xs),
+	close(Out).
+
+main :- findall(X, decl(_,X,_,_),Xs),
+	writeEach(user,Xs).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/semantics/prov-sem.html	Thu Dec 13 13:53:35 2012 +0000
@@ -0,0 +1,1164 @@
+<!DOCTYPE html>
+
+<html><head> 
+    <title>Semantics of the Provenance Data Model</title> 
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
+    <!-- 
+      === NOTA BENE ===
+      For the three scripts below, if your spec resides on dev.w3 you can check them
+      out in the same tree and use relative links so that they'll work offline,
+     -->
+<!-- PM -->
+    <style type="text/css">
+      .note { font-size:small; margin-left:50px }
+
+
+/* --- EDITORIAL NOTES --- */
+.pending {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #f00;
+    background: #BFEFFF;
+}
+
+.pending::before {
+    content:    "Pending Review";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #f00;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+
+
+
+.resolved {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #f00;
+    background: #9BCD9B;
+}
+
+.resolved::before {
+    content:    "Resolved";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #f00;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+
+.inference {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #f00;
+    background: #fff;
+}
+
+
+.inference-example {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #f00;
+    background: #fff;
+}
+
+/* .inference[id]::before { */
+/*     content:    "Inference: " attr(id); */
+/*     width:  380px;  /\* How can we compute the length of "Constraint: " attr(id) *\/ */
+/* } */
+
+
+/* .inference::before { */
+/*     content:    "Inference"; */
+/*     display:    block; */
+/*     width:  150px; */
+/*     margin: -1.5em 0 0.5em 0; */
+/*     font-weight:    bold; */
+/*     border: 1px solid #f00; */
+/*     background: #fff; */
+/*     padding:    3px 1em; */
+/* } */
+
+.syntax {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #f00;
+    background: #fff;
+}
+
+.syntax[id]::before {
+    content:    "Syntax: " attr(id);
+    width:  380px;  /* How can we compute the length of "Constraint: " attr(id) */
+}
+
+
+.syntax::before {
+    content:    "Syntax";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #f00;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+.unamedconstraint {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #00f;
+    background: #fff;
+}
+
+
+.unamedconstraint::before {
+    content:    "Constraint";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #00f;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+
+
+.constraint {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #00f;
+    background: #fff;
+}
+
+.constraint-example {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #00f;
+    background: #fff;
+}
+
+/* .constraint[id]::before { */
+/*     content:    "Constraint: " attr(id); */
+/*     width:  380px;  /\* How can we compute the length of "Constraint: " attr(id) *\/ */
+/* } */
+
+
+/* .constraint::before { */
+/*     content:    "Constraint"; */
+/*     display:    block; */
+/*     width:  150px; */
+/*     margin: -1.5em 0 0.5em 0; */
+/*     font-weight:    bold; */
+/*     border: 1px solid #00f; */
+/*     background: #fff; */
+/*     padding:    3px 1em; */
+/* } */
+
+
+
+.interpretation {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #00f;
+    background: #fff;
+}
+
+.interpretation[id]::before {
+    content:    "Interpretation: " attr(id);
+    width:  380px;  /* How can we compute the length of "Interpretation: " attr(id) */
+}
+
+
+.interpretation::before {
+    content:    "Interpretation";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #00f;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+.definition {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #777;
+    background: #fff;
+}
+
+.definition-example {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #777;
+    background: #fff;
+}
+
+/* .definition[id]::before { */
+/*     content:    "Definition: " attr(id); */
+/*     width:  380px;  */
+/* } */
+
+
+/* .definition::before { */
+/*     content:    "Definition"; */
+/*     display:    block; */
+/*     width:  150px; */
+/*     margin: -1.5em 0 0.5em 0; */
+/*     font-weight:    bold; */
+/*     border: 1px solid #000; */
+/*     background: #fff; */
+/*     padding:    3px 1em; */
+/* } */
+
+
+.deprecatedconstraint {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #00f;
+    background: #fff;
+}
+
+.deprecatedconstraint[id]::before {
+    content:    "Deprecated: " attr(id);
+    width:  380px;  /* How can we compute the length of "Deprecatedconstraint: " attr(id) */
+}
+
+
+.deprecatedconstraint::before {
+    content:    "Deprecated";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #00f;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+.glossary-ref {
+    font-style:    italic;
+}
+
+.dfn {
+    font-weight:    bold;
+}
+
+
+.attribute {
+    font-style: italic;
+}
+
+
+.conditional {
+    color: blue;
+}
+
+.grammar {
+    margin-top: 1ex;
+    margin-bottom: 1ex;
+    padding-left: 1ex;
+    padding-right: 1ex;
+    padding-top: 1ex;
+    padding-bottom: 0.6ex;
+    border: 1px dashed #2f6fab;
+    font-size: 95%;
+}
+.nonterminal {
+    font-weight: bold;
+    font-family: sans-serif;
+    font-size: 95%;
+}
+
+.name {
+    font-family: monospace;
+}
+
+.math {
+    font-family: roman;
+    font-style:italic;
+}
+
+
+.xmpl {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px solid #f00;
+    background: #fff;
+}
+
+.xmpl::before {
+    content:    "Example";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #f00;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+/*
+.anexample[count]::before {
+    content: "Example " attr(count) ;
+    font-family: sans-serif;
+    font-size: 1.6ex;
+    font-weight: bold;
+}
+
+.anexample:before {
+    content: "Example:";
+    font-family: sans-serif;
+    font-size: 1.6ex;
+    font-weight: bold;
+}
+
+*/
+
+.anexample {
+    margin-top: 1ex;
+    margin-bottom: 1ex;
+    padding-left: 1ex;
+    padding-right: 1ex;
+    padding-top: 1ex;
+    padding-bottom: 0.6ex;
+    border: 1px dashed #2f6fab;
+    background-color: #f9f9f9;
+}
+.anexample table {
+    background-color: #f9f9f9;
+}
+
+.conceptexample:before {
+    content: "Example:";
+    font-family: sans-serif;
+    font-size: 1.6ex;
+    font-weight: bold;
+}
+.conceptexample {
+    margin-top: 1ex;
+    margin-bottom: 1ex;
+    padding-left: 1ex;
+    padding-right: 1ex;
+    padding-top: 1ex;
+    padding-bottom: 0.6ex;
+    border: 1px dashed #2f6fab;
+    background-color: #f9f9f9;
+}
+
+.pnExpression {
+    font-weight: normal;
+    font-size:120%;
+    font-family: monospace;
+}
+
+
+div[class="grammar"] span[class="name"]:before {
+    content: "'";
+}
+
+div[class="grammar"] span[class="name"]:after {
+    content: "'";
+}
+
+
+div[class="grammar"] span[class="optional"]:before {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: "(";
+}
+
+div[class="grammar"] span[class="optional"]:after {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: ")?";
+}
+
+
+div[class="grammar"] span[class="plus"]:before {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: "(";
+}
+
+div[class="grammar"] span[class="plus"]:after {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: ")+";
+}
+
+
+div[class="grammar"] span[class="star"]:before {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: "(";
+}
+
+div[class="grammar"] span[class="star"]:after {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: ")*";
+}
+
+div[class="grammar"] span[class="choice"]:before {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: "(";
+}
+
+div[class="grammar"] span[class="choice"]:after {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: ")";
+}
+
+div[class="grammar"] span[class="group"]:before {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: "(";
+}
+
+div[class="grammar"] span[class="group"]:after {
+    font-weight: normal;
+    font-size:130%;
+    font-family: monospace;
+    content: ")";
+}
+
+table {
+    background-color: #f9f9f9;
+}
+
+.component1-color {
+ background-color: rgba(255,42,42,0.2);
+}
+
+.component2-color {
+ background-color: rgba(0,68,170,0.2);
+}
+
+.component3-color {
+ background-color: rgba(0,170,0,0.2);
+}
+.component4-color {
+ background-color: rgba(204,255,0,0.2);
+}
+
+.component5-color {
+ background-color: rgba(11,40,40,0.2);
+}
+
+.component6-color {
+ background-color: rgba(244,105,14,0.2);
+}
+
+.interpretation-forward::before {
+    content:    "Interpretation: ";
+    font-weight:    bold;
+}
+
+.structural-forward::before {
+    content:    "Structural constraint: ";
+    font-weight:    bold;
+}
+
+
+code {
+    color:  black;
+}
+
+.ruleTitle {
+    font-family: sans-serif;
+    font-size: 1.6ex;
+    font-weight: bold;
+}
+
+
+
+
+.remark {
+    padding:    1em;
+    margin: 1em 0em 0em;
+    border: 1px dashed #000;
+    background: #F0F0F0;
+}
+
+.remark::before {
+    content:    "Remark";
+    display:    block;
+    width:  150px;
+    margin: -1.5em 0 0.5em 0;
+    font-weight:    bold;
+    border: 1px solid #000;
+    background: #fff;
+    padding:    3px 1em;
+}
+
+table.thinborder {
+	border-width: 1px;
+	border-spacing: 0px;
+	border-style: none;
+	border-color: gray;
+	border-collapse: collapse;
+}
+table.thinborder th {
+	border-width: 1px;
+	padding: 0px;
+	border-style: solid;
+	border-color: gray;
+}
+table.thinborder td {
+	border-width: 1px;
+	padding: 2px;
+	border-style: solid;
+	border-color: gray;
+}
+
+
+     </style>
+
+    <script src="http://dev.w3.org/2009/dap/ReSpec.js/js/respec.js" class="remove"></script>  
+<!--    <script src="http://www.w3.org/Tools/respec/respec-w3c-common" class="remove" async></script> -->
+
+    <script src="http://www.w3.org/2007/OWL/toggles.js" class="remove"></script> 
+    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" class="remove"></script>
+
+    <script class="remove"> 
+
+function setColoredDiffs () {
+    $('dt').each(function(index) {
+        var content=$(this).text();
+        if (content== "Previous version:") {
+         console.log( "content " +  content);
+	  $(this).next().append(" ").append($('<a>').attr('href','diff-c.html').append("(colored-coded diff)"));
+        }
+    })
+}
+
+
+      function updateRules() {
+        var count=1;
+        $('.constraint,.definition,.inference').each(function(index) {
+
+          var myid=$(this).attr('id');
+          var mycount=count++;
+
+          if (myid==undefined) {
+            myid='rule_' + mycount;
+            $(this).attr('id',myid);
+          }
+
+          var myClass=$(this).attr('class');
+
+          var myTitle=capitaliseFirstLetter(myClass) + ' ' + mycount + ' (' + myid + ')';
+          
+          $(this).attr('data-count', mycount)
+                 .attr('data-title',myTitle).prepend($('<div>').addClass('ruleTitle')
+                                                          .append($('<a>').addClass('internalDFN').attr('href','#'+myid).append(myTitle)));
+
+          //console.log( "rule for " + myid + " " + mycount);
+
+        });
+		   
+        $('.constraint-example,.definition-example,.inference-example').each(function(index) {
+
+          var myid=$(this).attr('id');
+          var mycount='NNN';
+
+          if (myid==undefined) {
+            myid='rule_' + mycount;
+            $(this).attr('id',myid);
+          }
+
+          var myClass=$(this).attr('class');
+
+          var myTitle=capitaliseFirstLetter(myClass) + ' ' + mycount + ' (' + myid + ')';
+          
+          $(this).attr('data-count', mycount)
+                 .attr('data-title',myTitle).prepend($('<div>').addClass('ruleTitle')
+                                                          .append($('<a>').addClass('internalDFN').attr('href','#'+myid).append(myTitle)));
+
+          //console.log( "rule for " + myid + " " + mycount);
+
+        });
+      }
+
+          function capitaliseFirstLetter(string)
+          {
+          return string.charAt(0).toUpperCase() + string.slice(1);
+          }
+
+
+      function updateRulesRefs() {
+        $('.rule-ref').each(function(index) {
+
+          myhref=$(this).attr('href');
+
+          //console.log( "example ref for " + myhref);
+
+          mytitle=$(myhref).attr('data-title');
+
+          console.log( "rule ref for " + myhref + " " + mytitle);
+
+          $(this).children('span').replaceWith(function(){return $('<span>').append(mytitle)});
+
+        });
+
+        $('.rule-text').each(function(index) {
+
+          myhref=$(this).attr('href');
+          $(this).attr('href', myhref + '_text');
+
+          //console.log( "example ref for " + myhref);
+
+          mytitle=$(myhref).attr('data-title');
+
+          console.log( "rule ref for " + myhref + " " + mytitle);
+
+          $(this).children('span').replaceWith(function(){return $('<span>').append(mytitle)});
+
+        });
+      }
+      function updateExamples() {
+        var count=1;
+        $('.anexample').each(function(index) {
+
+          var myid=$(this).attr('id');
+          var mycount=count++;
+
+          if (myid==undefined) {
+            myid='example_' + mycount;
+            $(this).attr('id',myid);
+          }
+
+          
+          $(this).attr('data-count', mycount).prepend($('<div>').addClass('anexampleTitle')
+                                                          .append($('<a>').addClass('internalDFN').attr('href','#'+myid).append("Example " + mycount)));
+
+          //console.log( "example for " + myid + " " + mycount);
+
+        });
+      }
+
+
+      function updateExamplesRefs() {
+        $('.anexample-ref').each(function(index) {
+
+          myhref=$(this).attr('href');
+
+              //console.log( "example ref for " + myhref);
+
+          mycount=$(myhref).attr('data-count');
+
+              //console.log( "example ref for " + myhref + " " + mycount);
+
+          $(this).children('span').replaceWith(function(){return $('<span>').append("Example " + mycount)});
+
+        });
+      };
+
+
+        // function to replace figcaption since not allowed by prov rules, and not transformed by respec.js
+      function updateFigCaptions() {
+	var figureCount=1;
+
+        $('figcaption').each(function(index) {
+
+          var myid=$(this).attr('id');
+          var mycount=figureCount++;
+
+          $(this).replaceWith(function(){return $('<span>').addClass('figcaption').attr('data-count', mycount).attr('id',myid).append("Figure " + mycount)
+.append($('<sup>').append($('<a>').addClass('internalDFN').attr('href','#'+myid).append($('<span>').addClass('diamond').append(" &#9674;:")))).append(" ")
+.append($(this).contents())});
+        });
+      }
+
+        // function to replace figure since not allowed by prov rules, and not transformed by respec.js
+      function updateFigures() {
+        $('figure').each(function(index) {
+
+          var myid=$(this).attr('id');
+          var mystyle=$(this).attr('style');
+
+             console.log( "figure " + myid + " " + $(this).contents());
+
+          $(this).replaceWith(function(){
+                                          var aNewElement=$('<span>').addClass('figure').append($(this).contents());
+                                          if (myid) {
+                                            aNewElement.attr('id',myid)
+                                          }                                          
+                                          if (mystyle) {
+                                            aNewElement.attr('style',mystyle)
+                                          }                                          
+                                          return aNewElement });
+
+
+
+        //          $(this).replaceWith(function(){return $('<span>').addClass('figure').attr('id',myid).attr('style',mystyle).append($(this).contents())});
+             console.log( "figure " + myid);
+        });
+      }
+
+
+      function removeDataAttributes() {
+
+
+        $('.anexample').each(function(index) {
+          $(this).removeAttr('data-count');
+        });
+
+        $('caption').each(function(index) {
+          $(this).removeAttr('data-count');
+        });
+
+        $('.figcaption').each(function(index) {
+          $(this).removeAttr('data-count');
+        });
+
+        $('.definition').each(function(index) {
+          $(this).removeAttr('data-count');
+          $(this).removeAttr('data-title');
+        });
+
+        $('.inference').each(function(index) {
+          $(this).removeAttr('data-count');
+          $(this).removeAttr('data-title');
+        });
+
+        $('.constraint').each(function(index) {
+          $(this).removeAttr('data-count');
+          $(this).removeAttr('data-title');
+        });
+
+        $('.inference-example').each(function(index) {
+          $(this).removeAttr('data-count');
+          $(this).removeAttr('data-title');
+        });
+
+        $('.constraint-example').each(function(index) {
+          $(this).removeAttr('data-count');
+          $(this).removeAttr('data-title');
+        });
+
+        $('.definition-example').each(function(index) {
+          $(this).removeAttr('data-count');
+          $(this).removeAttr('data-title');
+        });
+}				    
+
+      $(document).ready(function(){
+        updateRules();
+        updateRulesRefs();
+        updateFigCaptions();
+	if (typeof String.prototype.startsWith != 'function') {
+            String.prototype.startsWith = function (str) {
+					    return this.indexOf(str) == 0;
+					  };
+        }
+	if (typeof String.prototype.contains != 'function') {
+            String.prototype.contains  = function (str) {
+					    return this.indexOf(str) >= 0;
+					  };
+        }
+
+
+
+      });
+</script>
+    <script src="provbib.js" class="remove"></script>
+
+    <script class="remove"> 
+
+
+      var addExtraReferences = function() {
+          for (var k in extraReferences)
+              berjon.biblio[k] = extraReferences[k];
+      };
+
+      var extraReferences = {
+        "CHR":
+         "Thom Frühwirth. "+
+         "<a        href=\"http://constraint-handling-rules.org/\"><cite>Constraint        Handling Rules</cite></a>."+
+         " Cambridge University Press "+
+         " URL: <a href=\"http://constraint-handling-rules.org/\">http://constraint-handling-rules.org/</a>",
+        "CLOCK":
+         "L. Lamport. "+
+         "<a href=\"http://research.microsoft.com/users/lamport/pubs/time-clocks.pdf\"><cite>Time, clocks, and the ordering of events in a distributed system</cite></a>."+
+         " Communications of the ACM 21 (7): 558–565. 1978. "+
+         "URL: <a href=\"http://research.microsoft.com/users/lamport/pubs/time-clocks.pdf\">http://research.microsoft.com/users/lamport/pubs/time-clocks.pdf</a> " +
+         "DOI: doi:10.1145/359545.359563.",
+        "CSP":
+         "Hoare, C. A. R. "+
+         "<a href=\"http://www.usingcsp.com/cspbook.pdf\"><cite>Communicating Sequential Processes</cite></a>."+
+         "Prentice-Hall. 1985"+
+         "URL: <a href=\"http://www.usingcsp.com/cspbook.pdf\">http://www.usingcsp.com/cspbook.pdf</a>",
+        "DBCONSTRAINTS":
+         " Ronald Fagin; Phokion G. Kolaitis; Renée J. Miller; Lucian Popa. "+
+         " <a href=\"http://dx.doi.org/10.1016/j.tcs.2004.10.033\"><cite>Data        exchange: Semantics and query answering</cite></a>.  Theoretical computer science 336(1):89-124 "+
+         "  Elsevier "+
+         " URL: <a href=\"http://dx.doi.org/10.1016/j.tcs.2004.10.033\">http://dx.doi.org/10.1016/j.tcs.2004.10.033</a>",
+	    "Logic":
+          "W. E. Johnson. "+
+          "<a href=\"http://www.ditext.com/johnson/intro-3.html\"><cite>Logic: Part III</cite></a>."+
+          "1924. "+
+          "URL: <a href=\"http://www.ditext.com/johnson/intro-3.html\">http://www.ditext.com/johnson/intro-3.html</a>",
+
+         "RDF":
+          "Graham Klyne and Jeremy J. Carroll (eds.) "+
+          "<a href=\"http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/\"><cite>Resource Description Framework (RDF): Concepts and Abstract Syntax</cite></a>. "+
+          "2004, W3C Recommendation. "+
+          "URL: <a href=\"http://www.w3.org/TR/2004/REC-rdf-concepts-20040210//\">http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/</a>",
+};
+      var respecConfig = {
+          // specification status (e.g. WD, LCWD, NOTE, etc.). If in doubt use ED.
+          specStatus:           "ED",
+          
+          // the specification's short name, as in http://www.w3.org/TR/short-name/
+          shortName:            "prov-sem",
+ 
+          // if your specification has a subtitle that goes below the main
+          // formal title, define it here
+          //subtitle : "<a href=\"diff-c.html\">Changes</a> since Last Call Working Draft  (LC)",
+
+
+
+          // if you wish the publication date to be other than today, set this
+         // publishDate:  "",
+
+          // if the specification's copyright date is a range of years, specify
+          // the start date here:
+          copyrightStart: "2012",
+ 
+          // if there is a previously published draft, uncomment this and set its YYYY-MM-DD date
+          // and its maturity status
+          
+          // if there a publicly available Editor's Draft, this is the link
+          edDraftURI:           "http://dvcs.w3.org/hg/prov/raw-file/default/model/prov-sem.html",
+
+
+
+ 
+          // if this is a LCWD, uncomment and set the end of its review period
+
+          // if you want to have extra CSS, append them to this list
+          // it is recommended that the respec.css stylesheet be kept
+          //extraCSS:             ["http://dev.w3.org/2009/dap/ReSpec.js/css/respec.css", "./extra.css"],
+ 
+          // editors, add as many as you like
+          // only "name" is required
+          editors:  [
+              { name: "James Cheney", url:
+          "http://homepages.inf.ed.ac.uk/jcheney", company:
+          "University of Edinburgh" },
+         ],
+ 
+          // authors, add as many as you like. 
+          // This is optional, uncomment if you have authors as well as editors.
+          // only "name" is required. Same format as editors.
+ 
+//authors:  [] ,
+         
+          // name of the WG
+          wg:           "Provenance Working Group",
+          
+          // URI of the public WG page
+          wgURI:        "http://www.w3.org/2011/prov/",
+          
+          // name (with the @w3c.org) of the public mailing to which comments are due
+          wgPublicList: "public-prov-comments",
+          
+          // URI of the patent status for this WG, for Rec-track documents
+          // !!!! IMPORTANT !!!!
+          // This is important for Rec-track documents, do not copy a patent URI from a random
+          // document unless you know what you're doing. If in doubt ask your friendly neighbourhood
+          // Team Contact.
+          wgPatentURI:  "http://www.w3.org/2004/01/pp-impl/46974/status",
+
+          // Add extraReferences to bibliography database
+          preProcess: [addExtraReferences, addProvReferences],
+
+          postProcess: [updateFigures, removeDataAttributes, checkLinksToW3CReports, setColoredDiffs],
+      };
+    </script> 
+  </head> 
+  <body> 
+
+    <section id="abstract">
+<p>
+Provenance is information about entities, activities, and people
+involved in producing a piece of data or thing, which can be used to
+form assessments about its quality, reliability or
+trustworthiness. PROV-DM is the conceptual data model that forms a
+basis for the W3C provenance (PROV) family of specifications.
+</p>
+
+
+<p> This document ... TODO </p>
+<p>The PROV Document Overview describes the overall state of PROV, and should be read before other PROV documents.</p>
+</section>
+
+<section id="sotd">
+<h4>PROV Family of Documents</h4>
+This document is part of the PROV family of documents, a set of documents defining various aspects that are necessary to achieve the vision of inter-operable
+interchange of provenance information in heterogeneous environments such as the Web.  These documents are:
+<ul>
+<li> <a href="http://www.w3.org/TR/2012/WD-prov-overview-20121211/">PROV-OVERVIEW</a> (Note), an overview of the PROV family of documents [[PROV-OVERVIEW]];</li>
+<li> <a href="http://www.w3.org/TR/2012/WD-prov-primer-20121211/">PROV-PRIMER</a> (Note), a primer for the PROV data model [[PROV-PRIMER]];</li>
+<li> <a href="http://www.w3.org/TR/2012/CR-prov-o-20121211/">PROV-O</a> (Recommendation), the PROV ontology, an OWL2 ontology allowing the mapping of PROV to RDF [[!PROV-O]];</li>
+<li> <a href="http://www.w3.org/TR/2012/CR-prov-dm-20121211/">PROV-DM</a> (Recommendation), the PROV data model for provenance [[!PROV-DM]];</li>
+<li> <a href="http://www.w3.org/TR/2012/CR-prov-n-20121211/">PROV-N</a> (Recommendation), a notation for provenance aimed at human consumption [[!PROV-N]];</li>
+<li> <a
+href="http://www.w3.org/TR/2012/CR-prov-constraints-20121211/">PROV-CONSTRAINTS</a>
+(Recommendation), a set of constraints applying to the PROV data model;</li>
+<li> <a href="http://www.w3.org/TR/2012/WD-prov-aq-20120619/">PROV-AQ</a> (Note), the mechanisms for accessing and querying provenance [[PROV-AQ]]; </li>
+<li> <a href="http://www.w3.org/TR/2012/WD-prov-xml-20121211/">PROV-XML</a> (Note),  an XML schema for the PROV data model [[PROV-XML]].</li>
+
+</ul>
+<h4>How to read the PROV Family of Documents</h4>
+<ul>
+<li>The primer is the entry point to PROV offering an introduction to the provenance model.</li>
+<li>The Linked Data and Semantic Web community should focus on PROV-O defining PROV classes and properties specified in an OWL2 ontology. For further details, PROV-DM and PROV-CONSTRAINTS specify the constraints applicable to the data model, and its interpretation. </li>
+<li>Developers seeking to retrieve or publish provenance should focus on PROV-AQ.</li>
+<li>Readers seeking to implement other PROV serializations
+should focus on PROV-DM and PROV-CONSTRAINTS.  PROV-O and PROV-N offer examples of mapping to RDF and text, respectively.</li>
+</ul>
+
+</section>
+
+
+
+
+    <section id="introduction"> 
+      <h2>Introduction<br>
+</h2> 
+
+<p>
+Provenance is a record that describes the people, institutions, entities, and activities involved in producing, influencing, or delivering a piece of data or a thing.
+This document complements
+  the PROV-DM specification [[PROV-DM]] that defines a data model for
+  provenance on the Web. This document defines a form of validation for provenance. </p>
+
+
+
+    <section id="conventions"> 
+<h3>Conventions</h3>
+
+
+
+<p>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+      NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and
+      "OPTIONAL" in this document are to be interpreted as described in
+      [[!RFC2119]].</p>
+
+<p>In this document, logical formulas contain variables written as
+    lower-case identifiers.  Some of these variables are written
+    beginning with the underscore character <span
+    class="name">_</span>, by convention, to indicate that they
+    appear only once in the formula.  Such variables are
+    provided merely as an aid to the reader.  </p>
+
+</section>
+
+
+<section id="purpose">
+
+<h3>Purpose of this document</h3>
+
+</section>
+
+<section>
+<h4>Structure of this document</h4>
+<p>
+</p>
+
+
+
+</section>
+<section id="audience">
+<h3> Audience </h3>
+
+
+<p>This document assumes familiarity with [[PROV-DM]] and employs the
+[[PROV-N]] notation.
+</p>
+
+</section>
+</section>
+
+
+<section id="inferences">
+<h2>Inferences</h2>
+<div class="inference" id="communication-generation-use-inference"><span class="math">&#8704; <span class="math">id</span>,<span class="math">a_2</span>,<span class="math">a_1</span>,<span class="math">attrs</span>. wasInformedBy(id,a_2,a_1,attrs) &#10233; &#8707; <span class="math">e</span>,<span class="math">gen</span>,<span class="math">t_1</span>,<span class="math">use</span>,<span class="math">t_2</span>. wasGeneratedBy(gen,e,a_1,t_1,[]) &#8743; used(use,a_2,e,t_2,[])</span></div>
+<div class="inference" id="generation-use-communication-inference"><span class="math">&#8704; <span class="math">gen</span>,<span class="math">a_1</span>,<span class="math">t_1</span>,<span class="math">attrs_1</span>,<span class="math">id_2</span>,<span class="math">a_2</span>,<span class="math">t_2</span>,<span class="math">attrs_2</span>. wasGeneratedBy(gen,e,a_1,t_1,attrs_1) &#8743; used(id_2,a_2,e,t_2,attrs_2) &#10233; &#8707; <span class="math">id</span>. wasInformedBy(id,a_2,a_1,[])</span></div>
+<div class="inference" id="entity-generation-invalidation-inference"><span class="math">&#8704; <span class="math">gen</span>,<span class="math">e</span>,<span class="math">a_1</span>,<span class="math">t_1</span>,<span class="math">attrs_1</span>,<span class="math">id_2</span>,<span class="math">a_2</span>,<span class="math">t_2</span>,<span class="math">attrs_2</span>. wasGeneratedBy(gen,e,a_1,t_1,attrs_1) &#8743; used(id_2,a_2,e,t_2,attrs_2) &#10233; &#8707; <span class="math">id</span>. wasInformedBy(id,a_2,a_1,[])</span></div>
+<div class="inference" id="activity-start-end-inference"><span class="math">&#8704; <span class="math">a</span>,<span class="math">t_1</span>,<span class="math">t_2</span>,<span class="math">attrs</span>. activity(a,t_1,t_2,attrs) &#10233; &#8707; <span class="math">start</span>,<span class="math">e_1</span>,<span class="math">a_1</span>,<span class="math">end</span>,<span class="math">a_2</span>,<span class="math">e_2</span>. wasStartedBy(start,a,e_1,a_1,t_1,[]) &#8743; wasEndedBy(end,a,e_2,a_2,t_2,[])</span></div>
+<div class="inference" id="wasStartedBy-inference"><span class="math">&#8704; <span class="math">id</span>,<span class="math">a</span>,<span class="math">e_1</span>,<span class="math">a_1</span>,<span class="math">t</span>,<span class="math">attrs</span>. wasStartedBy(id,a,e_1,a_1,t,attrs) &#10233; &#8707; <span class="math">gen</span>,<span class="math">t_1</span>. wasGeneratedBy(gen,e_1,a_1,t_1,[])</span></div>
+<div class="inference" id="wasEndedBy-inference"><span class="math">&#8704; <span class="math">id</span>,<span class="math">a</span>,<span class="math">e_1</span>,<span class="math">a_1</span>,<span class="math">t</span>,<span class="math">attrs</span>. wasEndedBy(id,a,e_1,a_1,t,attrs) &#10233; &#8707; <span class="math">gen</span>,<span class="math">t_1</span>. wasGeneratedBy(gen,e_1,a_1,t_1,[])</span></div>
+<div class="inference" id="derivation-generation-use-inference">In this inference, none of <math>a</math>, <math>gen_2</math> or <math>use_1</math> can be placeholders -<span class="math">&#8704; <span class="math">id</span>,<span class="math">e_2</span>,<span class="math">e_1</span>,<span class="math">a</span>,<span class="math">gen_2</span>,<span class="math">use_1</span>,<span class="math">attrs</span>. wasDerivedFrom(id,e_2,e_1,a,gen_2,use_1,attrs) &#10233; &#8707; <span class="math">s</span>,<span class="math">t_1</span>,<span class="math">t_2</span>. used(use_1,a,e_1,t_1,[]) &#8743; wasGeneratedBy(gen_2,e_2,a,t_2,[])</span></div>
+<div class="inference" id="revision-is-alternate-inference">In this inference, any of <math>a</math>, <math>g</math> or <math>u</math> may be placeholders.<span class="math">&#8704; <span class="math">id</span>,<span class="math">e_1</span>,<span class="math">e_2</span>,<span class="math">a</span>,<span class="math">g</span>,<span class="math">u</span>. wasDerivedFrom(id,e_2,e_1,a,g,u,.(=(prov:type,prov:Revision),[])) &#10233; alternateOf(e_2,e_1)</span></div>
+<div class="inference" id="attribution-inference"><span class="math">&#8704; <span class="math">att</span>,<span class="math">e</span>,<span class="math">ag</span>,<span class="math">attrs</span>. wasAttributedTo(att,e,ag,attrs) &#10233; &#8707; <span class="math">a</span>,<span class="math">t</span>,<span class="math">gen</span>,<span class="math">assoc</span>,<span class="math">pl</span>. wasGeneratedBy(gen,e,a,t,[]) &#8743; wasAssociatedWith(assoc,a,ag,pl,[])</span></div>
+<div class="inference" id="delegation-inference"><span class="math">&#8704; <span class="math">id</span>,<span class="math">ag_1</span>,<span class="math">ag_2</span>,<span class="math">a</span>,<span class="math">attrs</span>. actedOnBehalfOf(id,ag_1,ag_2,a,attrs) &#10233; &#8707; <span class="math">id_1</span>,<span class="math">pl_1</span>,<span class="math">id_2</span>,<span class="math">pl_2</span>. wasAssociatedWith(id_1,a,ag_1,pl_1,[]) &#8743; wasAssociatedWith(id_2,a,ag_2,pl_2,[])</span></div>
+<div class="inference" id="influence-inference"><ol><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">e</span>,<span class="math">a</span>,<span class="math">t</span>,<span class="math">attrs</span>. wasGeneratedBy(id,e,a,t,attrs) &#10233; wasInfluencedBy(id,e,a,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">a</span>,<span class="math">e</span>,<span class="math">t</span>,<span class="math">attrs</span>. used(id,a,e,t,attrs) &#10233; wasInfluencedBy(id,a,e,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">a_2</span>,<span class="math">a_1</span>,<span class="math">attrs</span>. wasInformedBy(id,a_2,a_1,attrs) &#10233; wasInfluencedBy(id,a_2,a_1,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">a_2</span>,<span class="math">e</span>,<span class="math">a_1</span>,<span class="math">t</span>,<span class="math">attrs</span>. wasStartedBy(id,a_2,e,a_1,t,attrs) &#10233; wasInfluencedBy(id,a_2,e,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">a_2</span>,<span class="math">e</span>,<span class="math">a_1</span>,<span class="math">t</span>,<span class="math">attrs</span>. wasEndedBy(id,a_2,e,a_1,t,attrs) &#10233; wasInfluencedBy(id,a_2,e,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">e</span>,<span class="math">a</span>,<span class="math">t</span>,<span class="math">attrs</span>. wasInvalidatedBy(id,e,a,t,attrs) &#10233; wasInfluencedBy(id,e,a,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">e_2</span>,<span class="math">e_1</span>,<span class="math">a</span>,<span class="math">g</span>,<span class="math">u</span>,<span class="math">attrs</span>. wasDerivedFrom(id,e_2,e_1,a,g,u,attrs) &#10233; wasInfluencedBy(id,e_2,e_1,attrs)</span></li><li>In this rule, <math>a</math>, <math>g</math>, <math>u</math> may be placeholders -.<span class="math">&#8704; <span class="math">id</span>,<span class="math">e</span>,<span class="math">ag</span>,<span class="math">attrs</span>. wasAttributedTo(id,e,ag,attrs) &#10233; wasInfluencedBy(id,e,ag,attrs)</span></li><li>In this rule, <math>pl</math> may be a placeholder -<span class="math">&#8704; <span class="math">id</span>,<span class="math">a</span>,<span class="math">ag</span>,<span class="math">pl</span>,<span class="math">attrs</span>. wasAssociatedWith(id,a,ag,pl,attrs) &#10233; wasInfluencedBy(id,a,ag,attrs)</span></li><li><span class="math">&#8704; <span class="math">id</span>,<span class="math">ag_2</span>,<span class="math">ag_1</span>,<span class="math">a</span>,<span class="math">attrs</span>. actedOnBehalfOf(id,ag_2,ag_1,a,attrs) &#10233; wasInfluencedBy(id,ag_2,ag_1,attrs)</span></li></ol></div>
+<div class="inference" id="alternate-reflexive"><span class="math">&#8704; <span class="math">e</span>. entity(e) &#10233; alternateOf(e,e)</span></div>
+<div class="inference" id="alternate-transitive"><span class="math">&#8704; <span class="math">e_1</span>,<span class="math">e_2</span>,<span class="math">e_3</span>. alternateOf(e_1,e_2) &#8743; alternateOf(e_2,e_3) &#10233; alternateOf(e_1,e_3)</span></div>
+<div class="inference" id="alternate-symmetric"><span class="math">&#8704; <span class="math">e_1</span>,<span class="math">e_2</span>. alternateOf(e_1,e_2) &#10233; alternateOf(e_2,e_1)</span></div>
+<div class="inference" id="specialization-transitive"><span class="math">&#8704; <span class="math">e_1</span>,<span class="math">e_2</span>,<span class="math">e_3</span>. specializationOf(e_1,e_2) &#8743; specializationOf(e_2,e_3) &#10233; specializationOf(e_1,e_3)</span></div>
+<div class="inference" id="specialization-alternate-inference"><span class="math">&#8704; <span class="math">e_1</span>,<span class="math">e_2</span>. specializationOf(e_1,e_2) &#10233; alternateOf(e_1,e_2)</span></div>
+<div class="inference" id="specialization-attributes-inference"><span class="math">&#8704; <span class="math">e_1</span>,<span class="math">attrs</span>,<span class="math">e_2</span>. entity(e_1,attrs) &#8743; specializationOf(e_2,e_1) &#10233; entity(e_2,attrs)</span></div>
+
+
+</section>
+
+<section class="appendix"> 
+      <h2>Acknowledgements</h2> 
+      <p> 
+
+This  document has been produced by the PROV Working Group, and its contents reflect extensive discussion within the Working Group as a whole. The editors extend special thanks to Ivan Herman (W3C/ERCIM), Paul Groth, Tim Lebo, Simon Miles, Stian Soiland-Reyes,  for their thorough reviews.
+      </p> 
+
+<p>
+Members of the PROV Working Group at the time of publication of this document were:
+
+Ilkay Altintas (Invited expert),
+Reza B'Far (Oracle Corporation),
+Khalid Belhajjame (University of Manchester),
+James Cheney (University of Edinburgh, School of Informatics),
+Sam Coppens (IBBT),
+David Corsar (University of Aberdeen, Computing Science),
+Stephen Cresswell (The National Archives),
+Tom De Nies (IBBT),
+Helena Deus (DERI Galway at the National University of Ireland, Galway, Ireland),
+Simon Dobson (Invited expert),
+Martin Doerr (Foundation for Research and Technology - Hellas(FORTH)),
+Kai Eckert (Invited expert),
+Jean-Pierre EVAIN (European Broadcasting Union, EBU-UER),
+James Frew (Invited expert),
+Irini Fundulaki (Foundation for Research and Technology - Hellas(FORTH)),
+Daniel Garijo (Universidad Politécnica de Madrid),
+Yolanda Gil (Invited expert),
+Ryan Golden (Oracle Corporation),
+Paul Groth (Vrije Universiteit),
+Olaf Hartig (Invited expert),
+David Hau (National Cancer Institute, NCI),
+Sandro Hawke (W3C/MIT),
+Jörn Hees (German Research Center for Artificial Intelligence (DFKI) Gmbh),
+Ivan Herman, (W3C/ERCIM),
+Ralph Hodgson (TopQuadrant),
+Hook Hua (Invited expert),
+Trung Dong Huynh (University of Southampton),
+Graham Klyne (University of Oxford),
+Michael Lang (Revelytix, Inc.),
+Timothy Lebo (Rensselaer Polytechnic Institute),
+James McCusker (Rensselaer Polytechnic Institute),
+Deborah McGuinness (Rensselaer Polytechnic Institute),
+Simon Miles (Invited expert),
+Paolo Missier (School of Computing Science, Newcastle university),
+Luc Moreau (University of Southampton),
+James Myers (Rensselaer Polytechnic Institute),
+Vinh Nguyen (Wright State University),
+Edoardo Pignotti (University of Aberdeen, Computing Science),
+Paulo da Silva Pinheiro (Rensselaer Polytechnic Institute),
+Carl Reed (Open Geospatial Consortium),
+Adam Retter (Invited Expert),
+Christine Runnegar (Invited expert),
+Satya Sahoo (Invited expert),
+David Schaengold (Revelytix, Inc.),
+Daniel Schutzer (FSTC, Financial Services Technology Consortium),
+Yogesh Simmhan (Invited expert),
+Stian Soiland-Reyes (University of Manchester),
+Eric Stephan (Pacific Northwest National Laboratory),
+Linda Stewart (The National Archives),
+Ed Summers (Library of Congress),
+Maria Theodoridou (Foundation for Research and Technology - Hellas(FORTH)),
+Ted Thibodeau (OpenLink Software Inc.),
+Curt Tilmes (National Aeronautics and Space Administration),
+Craig Trim (IBM Corporation),
+Stephan Zednik (Rensselaer Polytechnic Institute),
+Jun Zhao (University of Oxford),
+Yuting Zhao (University of Aberdeen, Computing Science).
+</p>
+    </section> 
+
+ </body></html>
+
+<!--  LocalWords:  px DM RL RDF AQ SEM SOTD Definitional wasInformedBy attrs ag
+ -->
+<!--  LocalWords:  wasGeneratedBy wasStartedBy gAttr sAttr wasAttributedTo attr
+ -->
+<!--  LocalWords:  wasAssociatedWith dAttrs gAttrs wasDerivedFrom uAttrs eAttrs
+ -->
+<!--  LocalWords:  wasRevisionOf specializationOf wasQuotedFrom Traceability WD
+ -->
+<!--  LocalWords:  tracedTo aAttr actedOnBehalfOf rAttr traceability TODO xsd
+ -->
+<!--  LocalWords:  alternateOf wasEndedBy Lamport's timeline subfigure memberOf
+ -->
+<!--  LocalWords:  wasStartedByAgent wasAttributedWith derivedByInsertionFrom
+ -->
+<!--  LocalWords:  QName derivedByRemovalFrom EmptyCollection wasVersionOf dm
+ -->
+<!--  LocalWords:  RecsWD formedness workflow ness operability CSP versa hyp YY
+ -->
+<!--  LocalWords:  disambiguating lifecycle conformant minimalistic Lamport fo
+ -->
+<!--  LocalWords:  reflexivity antisymmetry timelines timespan WG concl inv TBD
+ -->
+<!--  LocalWords:  continuant occurrent modalities toyota womanInRedDress provn
+ -->
+<!--  LocalWords:  customerInChairAt manWithGlasses customerInChair irreflexive
+ -->
+<!--  LocalWords:  wasStartedByActivity antisymmetric wasInvalidatedBy stmt CHR
+ -->
+<!--  LocalWords:  DBCONSTRAINTS formalisms URIs wasInfluencedBy definitional
+ -->
+<!--  LocalWords:  wasInvalidated th  nontermination  implementability att evt
+ -->
+<!--  LocalWords:  Irreflexivity mentionOf preorder equalities unsatisfiable De
+ -->
+<!--  LocalWords:  Lebo subfigures pre del irreflexivity superproperty typeOf
+ -->
+<!--  LocalWords:  disjointness inferrable subtyping subtype subtypes hadMember
+ -->
+<!--  LocalWords:  hasMember toplevel sameAs tuple acyclicity isomorphism IRI
+ -->
+<!--  LocalWords:  endBundle typeof equational acyclic invertible procedurally
+ -->
+<!--  LocalWords:  implementers multi unifier ERCIM Groth Stian Soiland Ilkay
+ -->
+<!--  LocalWords:  Altintas Reza B'Far Belhajjame Informatics Coppens IBBT Nies
+ -->
+<!--  LocalWords:  Corsar Cresswell Deus DERI Galway satisfiable namespace Kai
+ -->
+<!--  LocalWords:  endDocument Dobson Doerr Hellas Eckert EVAIN EBU UER Frew de
+ -->
+<!--  LocalWords:  Irini Fundulaki Garijo Universidad Politécnica Vrije Hartig
+ -->
+<!--  LocalWords:  Universiteit Hau NCI Sandro Hawke Jörn Hees DFKI Gmbh Hua da
+ -->
+<!--  LocalWords:  Hodgson TopQuadrant Trung Huynh Klyne Revelytix Rensselaer
+ -->
+<!--  LocalWords:  McCusker McGuinness Paolo Missier Luc Moreau Vinh Edoardo
+ -->
+<!--  LocalWords:  Pignotti Paulo Pinheiro Geospatial Retter Runnegar Satya
+ -->
+<!--  LocalWords:  Sahoo Schaengold Schutzer FSTC Yogesh Simmhan Theodoridou
+ -->
+<!--  LocalWords:  Thibodeau OpenLink Tilmes Zednik Zhao Yuting
+ -->