Universidade Federal de Pernambuco
Centro de Informática
Pós Graduação em Ciências da Computação
CHORD: CONSTRAINT HANDLING
OBJECT-ORIENTED RULES WITH
DISJUNCTIONS
Marcos Aurélio Almeida da Silva
DISSERTAÇÃO DE MESTRADO
Recife
Fevereiro/2009
Universidade Federal de Pernambuco
Centro de Informática
Marcos Aurélio Almeida da Silva
CHORD: CONSTRAINT HANDLING OBJECT-ORIENTED RULES
WITH DISJUNCTIONS
Trabalho apresentado ao Programa de Pós Graduação em
Ciências da Computação do Centro de Informática da Universidade Federal de Pernambuco como requisito parcial
para obtenção do grau de Mestre em Ciências da Computação.
Orientador: Prof. Jacques Pierre Louis Robin
Recife
Fevereiro/2009
Silva, Marcos Aurélio Almeida da
CHORD: constraint handling object-oriented
rules with disjunctions / Marcos Aurélio Almeida da
Silva - Recife : O Autor, 2009.
xxi, 177 p. : il., fig.
Dissertação (mestrado) – Universidade Federal
de Pernambuco. CIn. Ciência da Computação, 2009.
Inclui bibliografia, apêndice.
1. Inteligência artificial.
software. I. Título.
006.3
CDD (22.ed.)
2. Engenharia de
MEI2009-023
to my parents...
As lı́nguas são aspectos fundamentais, únicos e irrepetı́veis da experiência
humana. E, aliás, a caracterı́stica maior de nossa espécie. Cada lı́ngua
que desaparece – principalmente sem deixar vestı́gios, sem ter sido
estudada e documentada – significa a extinção de uma espécie.
—CARLOS DO AMARAL FREIRE (2003)
174
SOURCE CODE FOR OWL CASE STUDY
Property1~:rdf_Property,
eq(Property1,Property2) ==>
Property1~[owl_equivalentProperty->Property2].
Property1~[owl_equivalentProperty->Property2],
O~[Property1->v] ==> O~[Property2->v].
% owl:inverseOf
% x,y \in IOOP and <u,v> \in EXTI(x) iff <v,u> \in EXTI(y)
Prop1~[owl_inverseOf->Prop2],
X~[Prop1->Y] ==> Y~[Prop2->X].
Prop1~[owl_inverseOf->Prop2] ==> Prop2~[owl_inverseOf->Prop1].
% owl:sameAs x = y
% not fully supported
Thing1~[owl_sameAs->Thing2] ==> eq(Thing1,Thing2).
Thing1~: owl_Thing, eq(Thing1,Thing2) ==> Thing1~[owl_sameAs->Thing2].
% complementarity of = and \neq
Thing1~[owl_sameAs->Thing2], Thing1~[owl_differentFrom->Thing2] ==> false.
% owl:differentFrom x \neq y
% not fully supported
Thing1~[owl_differentFrom->Thing1] ==> false.
Thing1~[owl_differentFrom->Thing2] ==> Thing2~[owl_differentFrom->Thing1].
% owl:complementOf
x,y \in
IOC and CEXTI(x)=IOT-CEXTI(y)
Class1~[owl_complementOf->Class2],
X ~: Class1, X ~: Class2 ==> false.
X ~: owl_Thing,
Class1~[owl_complementOf->Class2]
==> (X ~: Class1 ; X ~: Class2).
Class1~[owl_complementOf->Class2] ==> Class2~[owl_complementOf->Class1].
Class1~[owl_complementOf->Class2],
Class2~[owl_complementOf->Class3] ==> eq(Class1,Class3).
% owl:unionOf
%
x \in IOC and y is a sequence of y1,...yn over IOC and
CEXTI(x) = CEXTI(y1) \cup ... \cup CEXTI(yn)
SOURCE CODE FOR OWL CASE STUDY
175
Class~[owl_unionOf->List], List~[prologList=PList],
Object~:Class1 ==> member(Class1, PList) | Object ~: Class.
Class~[owl_unionOf->List], List~[prologList=PList],
Object~:Class ==> member(Class1, PList), Object ~: Class1.
Class~[owl_unionOf->List],
List~[prologList=PList] ==>
member(Class1,PList) | Class1::Class.
% owl:intersectionOf
%
x \in IOC and y is a sequence of y1,...yn over IOC and
%
CEXTI(x) = CEXTI(y1) \cap ... \cap CEXTI(yn)
Class~[owl_intersectionOf->List], List~[prologList=PList],
Object~:Class ==> member(Class1, PList) | Object ~: Class1.
Class~[owl_intersectionOf->List],
List~[prologList=PList]
==> member(Class1,PList) | Class::Class1.
% owl:oneOf
%
x \in CI and y is a sequence of y1,...yn over IOT or
%
over LvI and CEXTI(x) = {y1,..., yn}
% owl:oneOf l is a sequence of y1,...yn over LvI
x \in IDC
% owl:oneOf l is a sequence of y1,...yn over IOT x \in IOC
Object~:Class,
Class~[owl_oneOf->List],
List~[prologList=PList] ==> member(Object, PList).
% ATENTION: the following ones are IF
%<x,y> \in EXTI(SI(owl:allvaluesFrom))) ^ <x,p> \in EXTI(SI(owl:onProperty)))
% {u \in IOT | <u,v> \in EXTI(p) implies v \in CEXTI(y) }
Class~:owl_Restriction,
Class~[owl_allvaluesFrom->FromClass], Class~[owl_onProperty->Prop],
X~[Prop->v], v~:FromClass ==> X~:Class.
Class~:owl_Restriction,
Class~[owl_allvaluesFrom->FromClass], Class~[owl_onProperty->Prop],
X~:Class, X~[Prop->v] ==> v~:FromClass.
% <x,y> \in EXTI(SI(owl:somevaluesFrom))) ^ <x,p> \in EXTI(SI(owl:onProperty)))
% {u \in IOT | \exists <u,v> \in EXTI(p) such that v \in CEXTI(y) }
176
SOURCE CODE FOR OWL CASE STUDY
Class~:owl_Restriction,
Class~[owl_somevaluesFrom->FromClass], Class~[owl_onProperty->Prop],
X~:Class ==> X~[Prop->v], v~:FromClass.
% <x,y> \in EXTI(SI(owl:hasvalue))) ^ <x,p> \in EXTI(SI(owl:onProperty)))
%{u \in IOT | <u, y> \in EXTI(p) }
Class~:owl_Restriction,
Class~[owl_hasvalue->value], Class~[owl_onProperty->Prop],
X~:Class ==> X~[Prop->value].
Class~:owl_Restriction,
Class~[owl_hasvalue->value], Class~[owl_onProperty->Prop],
X~[Prop->value] ==> X~:Class.
% <x,y> \in EXTI(SI(owl:cardinality))) ^ <x,p> \in EXTI(SI(owl:onProperty)))
% {u \in IOT | card({v \in IOT \cup Lv : <u,v> \in EXTI(p)}) = y }
% not fully supported
Class~:owl_Restriction,
Class~[owl_cardinality->value], Class~[owl_onProperty->Prop],
X~[Prop->value] ==> X~:Class.
% EXTRA
% allDifferent
_~[owl_distinctMembers->List], List~[prologList=PList]
==> computeCProd(PList, CPList) | addDistinct(CPList).
computeCProd([A,B], [(A,B)]).
computeCProd([H|R], CP) :computeCProd(R, CP0),
putInFront(H, R, CP1),
append(CP0, CP1, CP).
putInFront(H, [v], [(H,v)]).
putInFront(H, [H1|R1], PI) :putInFront(H, R1, PI0),
PI = [(H,H1)|PI0].
addDistinct([]) <=> true.
addDistinct([(A,B)|R]) <=> A~[owl_differentFrom->B], addDistinct(R).
% UTILS
% RDF LISTS
177
SOURCE CODE FOR OWL CASE STUDY
% compute the prolog equivalent of a RDF list
L~:rdf_List ==> rdfComputeList(L,L,[]).
rdfComputeList(List, rdf_nil,PList) <=> List~[prologList=PList].
ListHead~[rdf_first->First],
ListHead~[rdf_rest->Rest] \ rdfComputeList(List, ListHead,PTail) <=>
List=ListHead |
append(PTail, [First], NewList),
rdfComputeList(List, Rest,NewList).
% EQUALITY
% reflexivity of =
O~:_ ==> eq(O,O).
_::C ==> eq(C,C).
O~[_->_] ==> eq(O,O).
_~[_->O] ==> eq(O,O).
_~[P->_] ==> eq(P,P).
% transitivity of =
eq(Thing1,Thing2), eq(Thing2,Thing3) ==> eq(Thing1,Thing3).
% commutativity?
eq(Thing1,Thing2) ==> eq(Thing2,Thing1).
eq(Thing1,Thing2),
eq(Thing1,Thing2),
eq(Thing1,Thing2),
eq(Thing1,Thing2),
eq(Thing1,Thing2),
Thing1~:X ==>
Thing1::X ==>
Thing1~[P->v]
O~[P->Thing1]
O~[Thing1->v]
Thing2~:X.
Thing2::X.
==> Thing2~[P->v].
==> O~[P->Thing2].
==> O~[Thing2->v].
This volume has been typeset in LATEXwith the UFPEThesis class (www.cin.ufpe.br/∼paguso/
ufpethesis).
Download

full-text