### Fuzzy Logic theory -- Jos De Roo, Gijs Muys

@prefix log: <http://www.w3.org/2000/10/swap/log#>.
@prefix math: <http://www.w3.org/2000/10/swap/math#>.
@prefix list: <http://www.w3.org/2000/10/swap/list#>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix func: <http://www.w3.org/2007/rif-builtin-function#>.
@prefix e: <http://eulersharp.sourceforge.net/2003/03swap/log-rules#>.
@prefix fl: <http://eulersharp.sourceforge.net/2003/03swap/fl-rules#>.

### classes
fl:Lower a rdfs:Class;
    rdfs:comment "class of things that are the first element of e:valuation object".

fl:Upper a rdfs:Class;
    rdfs:comment "class of things that are the last element of e:valuation object".

### properties
fl:mu a rdf:Property;
    rdfs:domain rdf:List;
    rdfs:range e:Number;
    rdfs:comment "to express fuzzy set membership e.g. (:x :C) fl:mu 0.8 says that :x a :C to a degree of 0.8".

fl:sigma a rdf:Property;
    rdfs:domain rdf:List;
    rdfs:range e:Number;
    rdfs:comment "to express fuzzy subsethood e.g. (:C :D) fl:sigma 0.9 says that :C rdfs:subClassOf :D to a degree of 0.9".

fl:pi a rdf:Property, e:Builtin;
    rdfs:domain rdf:List;
    rdfs:range e:Number;
    rdfs:comment "builtin to calculate fuzzy set membership according to Elpiniki Papageorgiou method".

# FGCM properties
fl:gmu a rdf:Property;
    rdfs:domain rdf:List;
    rdfs:range rdf:List;
    rdfs:comment "to express grey membership e.g. (:x :C) fl:gmu (0.1 0.4) means that :x belongs to :C with a degree between 0.1 and 0.4. It can be any value in-between but we do not know the exact value for sure.".

fl:gsigma a rdf:Property;
    rdfs:domain rdf:List;
    rdfs:range rdf:List;
        rdfs:comment "to express grey subsethood e.g. (:C :D) fl:gsigma (0.1 0.4) means that :C rdfs:subClassOf :D with a degree between 0.1 and 0.4. It can be any value in-between but we do not know the exact value for sure.";
        rdfs:comment "Sigma can also be considered as one way correlation where 0 is negative correlation and 1 is positive correlation.".

fl:gpi a rdf:Property, e:Builtin;
    rdfs:domain rdf:List;
    rdfs:range rdf:List;
    rdfs:comment "built-in to calculate fuzzy grey inference according to Elpiniki Papageorgiou method".

### conjunction according to Lukasiewicz
{
    ?C owl:intersectionOf ?E.
    ?E func:distinct-values ?U.
    ?U list:first ?A.
    ?U list:rest ?B.
     (?X ?A) fl:pi ?I.
     ?D owl:intersectionOf ?B.
     (?X ?D) fl:pi ?J.
     (?I ?J -1.0) math:sum ?K.
     (0.0 ?K) e:max ?M
 } => {
     (?X ?C) fl:pi ?M.
 }.

### disjunction according to Lukasiewicz
{
    ?C owl:unionOf ?E.
    ?E func:distinct-values ?U.
    ?U list:first ?A.
    ?U list:rest ?B.
    (?X ?A) fl:pi ?I.
    ?D owl:unionOf ?B.
    (?X ?D) fl:pi ?J.
    (?I ?J) math:sum ?K.
    (1.0 ?K) e:min ?M.
} => {
    (?X ?C) fl:pi ?M.
}.

### negation according to Lukasiewicz
{
    ?C owl:complementOf ?A.
    (?X ?A) fl:pi ?I.
    (1.0 ?I) math:difference ?M.
} => {
    (?X ?C) fl:pi ?M.
}.

### implication
{
    ?A rdfs:subClassOf ?B.
} => {
    (?A ?B) fl:sigma 1.0 .
}.

# Creates edge to itself (necessary calculation in algorithm)
{
    (?B ?A) fl:sigma ?I.
} => {
    (?A ?A) fl:sigma 1.0 .
}.

{
    ?C owl:complementOf ?A.
    (?B ?A) fl:sigma ?I.
    (1.0 ?I) math:difference ?M.
} => {
    (?B ?C) fl:sigma ?M.
}.

### Allows you to run FGCM algorithm on FCM model & ability to express non-grey nodes in FGCM model
{
    (?B ?A) fl:sigma ?I.
} => {
    (?B ?A) fl:gsigma (?I ?I).
}.

{
    (?B ?A) fl:mu ?I.
} => {
    (?B ?A) fl:gmu (?I ?I).
}.

{
    (?B ?A) fl:pi ?I.
} => {
    (?B ?A) fl:gpi (?I ?I).
}.

### Fuzzy Description Logic to Fuzzy Cognitive Map translation theory
{
    {?P a ?Q} e:valuation (?L ?U).
} => {
    (?P (?Q fl:Lower)) fl:mu ?L.
}.

{
    {?P a ?Q} e:valuation (?L ?U).
} => {
    (?P (?Q fl:Upper)) fl:mu ?U.
}.

{
    {?X rdfs:subClassOf ?Y} e:valuation (?L ?U).
} => {
    ((?X fl:Lower) (?Y fl:Lower)) fl:sigma ?L.
}.

{
    {?X rdfs:subClassOf ?Y} e:valuation (?L ?U).
} => {
    ((?X fl:Upper) (?Y fl:Upper)) fl:sigma ?U.
}.

{
    {?X owl:complementOf ?Q. ?Q rdfs:subClassOf ?Y} e:valuation (?L ?U).
    (1.0 ?L) math:difference ?M.
} => {
    ((?Y fl:Lower) (?X fl:Lower)) fl:sigma ?M.
}.

{
    {?X owl:complementOf ?Q. ?Q rdfs:subClassOf ?Y} e:valuation (?L ?U).
    (1.0 ?U) math:difference ?M.
} => {
    ((?Y fl:Upper) (?X fl:Upper)) fl:sigma ?M.
}.

{
    (?P (?C fl:Lower)) fl:pi ?X.
    (?P (?C fl:Upper)) fl:pi ?Y.
    ?Z e:optional {
        ?X math:notGreaterThan ?Y.
        ?S log:equalTo (?X ?Y).
    }.
    ?Z e:optional {
        ?X math:greaterThan ?Y.
        ?S log:equalTo (?Y ?X).
    }.
} => {
    {?P a ?C} e:valuation ?S.
}.

### support
owl:Thing owl:intersectionOf ().
owl:Nothing owl:unionOf ().

{
    ?C owl:intersectionOf ?U.
    ?U list:rest ?B.
} => {
    _:D owl:intersectionOf ?B.
}.

{
    ?C owl:unionOf ?U.
    ?U list:rest ?B.
} => {
    _:D owl:unionOf ?B.
}.

{
    (?X ?A) fl:mu ?I.
} => {
    (?X owl:Thing) fl:mu 1.0 .
}.

{
    (?X ?A) fl:mu ?I.
} => {
    (?X owl:Nothing) fl:mu 0.0 .
}.
