# Auto-generated AIR inclusion policy.

@prefix air: <http://dig.csail.mit.edu/TAMI/2007/amord/air#>.
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
@prefix math: <http://www.w3.org/2000/10/swap/math#>.
@prefix s: <http://dig.csail.mit.edu/2009/IARPA-PIR/sparql#>.
@prefix : <>.

# User-defined namespaces:
@prefix example: <http://www.example.com/#> .

@forAll :P, :Q, :T, :U, :V, :W.
@forAll :T0, :U0, :V0. # Variables for example:name
@forAll :T1, :U1, :V1. # Variables for example:age
@forAll :T2, :U2, :V2. # Variables for example:dob
@forAll :T3, :U3, :V3. # Variables for example:ssn

:sample-inclusion a air:Policy;
    air:label "A sample auto-generated inclusion policy.";
    air:rule :sample-inclusion-check.
		
:sample-inclusion-check a air:BeliefRule;
    air:label "sample-inclusion query check";
    air:pattern {
        :Q a s:SPARQLQuery;
           s:retrieve :P;
           s:clause :W.
    };
    air:description ("Make sure this is a query.");
    # Goes to the first rule. If there are no attributes,
    # simply go to the default rule.
    air:rule :sample-inclusion-compliance-rule.

:sample-inclusion-compliance-rule a air:BeliefRule;
    air:label "sample-inclusion, an inclusion policy.";
    air:pattern {
        # Catch RETRIEVE
        :P s:var :V0.
        :W s:triplePattern :T0.
        :T0 log:includes { [] example:name :V0 } .
        # Catch USE
        :W s:triplePattern :T1.
        :T1 log:includes { [] example:age :V1 }.
        :W s:triplePattern :U1.
        :U1 log:includes { :V1 [] [] } .
        # Catch RETRIEVE
        :P s:var :V2.
        :W s:triplePattern :T2.
        :T2 log:includes { [] example:dob :V2 } .
        # Catch USE
        :W s:triplePattern :T3.
        :T3 log:includes { [] example:ssn :V3 }.
        :W s:triplePattern :U3.
        :U3 log:includes { :V3 [] [] } .
        };
    air:description ("This inclusion policy states that you must do all four of these actions: RETRIEVE example:name, USE example:age, RETRIEVE example:dob, USE example:ssn. This query is compliant: " :Q ) ;
    air:assert{ :Q air:compliant-with :sample-inclusion } ;
    # All or none. If we don't match all, start looking for individuals.
    air:alt [ air:rule :sample-inclusion-rule-0 ] .

:sample-inclusion-rule-0 a air:BeliefRule;
    air:label "sample-inclusion example:name usage check";
    air:pattern {
	# if RETRIEVE, or alternately, not USE
        :P s:var :V;
        :W s:triplePattern :T;
        :T log:includes { [] example:name :V }
        };
    air:description ("Inclusion includes RETRIEVE of example:name, violated by " :T );
    air:assert{:Q air:non-compliant-with :sample-inclusion)};
    # There are more attributes, go to the next policy.
    air:alt [ air:rule :sample-inclusion-rule-1 ] .
		
:sample-inclusion-rule-1 a air:BeliefRule;
    air:label "sample-inclusion example:age usage check";
    air:pattern {
	# if USE
        :W s:triplePattern :T;
        :T log:includes { [] example:age :V };
        :W s:triplePattern :U;
        :U log:includes { :V [] [] }.
        };
    air:description ("Inclusion includes USE of example:age, violated by " :T );
    air:assert{:Q air:non-compliant-with :sample-inclusion)};
    # There are more attributes, go to the next policy.
    air:alt [ air:rule :sample-inclusion-rule-2 ] .
		
:sample-inclusion-rule-2 a air:BeliefRule;
    air:label "sample-inclusion example:dob usage check";
    air:pattern {
	# if RETRIEVE, or alternately, not USE
        :P s:var :V;
        :W s:triplePattern :T;
        :T log:includes { [] example:dob :V }
        };
    air:description ("Inclusion includes RETRIEVE of example:dob, violated by " :T );
    air:assert{:Q air:non-compliant-with :sample-inclusion)};
    # There are more attributes, go to the next policy.
    air:alt [ air:rule :sample-inclusion-rule-3 ] .
		
:sample-inclusion-rule-3 a air:BeliefRule;
    air:label "sample-inclusion example:ssn usage check";
    air:pattern {
	# if USE
        :W s:triplePattern :T;
        :T log:includes { [] example:ssn :V };
        :W s:triplePattern :U;
        :U log:includes { :V [] [] }.
        };
    air:description ("Inclusion includes USE of example:ssn, violated by " :T );
    air:assert{:Q air:non-compliant-with :sample-inclusion)};
    # No more attributes, go to the base case.
    air:alt [ air:rule :sample-inclusion-default ] .


:sample-inclusion-default a air:BeliefRule;
    air:label "sample-inclusion default rule";
    air:pattern { # Empty search.
        };
    air:description ("This inclusion policy states that you must do all four of these actions: RETRIEVE example:name, USE example:age, RETRIEVE example:dob, USE example:ssn. No regulated attributes found. Asserting compliance.");
    air:assert{ :Q air:compliant-with :sample-inclusion } .
	
#ends
