Przypisywanie podpisu do stałych symboli
Opis podpisów (ang. signatures) został umieszczony tutaj. Podpisy nie są częścią składni RIFa.
Obsługiwane typy termów
RIF-BLD wspiera powyższe typy termów:
stałe
zmienne
pozycjonowane
z nazwanymi argumentami
równościowe
ramy
należące do klasy
należące do podklas
Wspierane przestrzenie symboli
-
-
-
-
-
-
rif:text (dla ciągów znaków z dołączonymi tagami językowymi)
rif:iri (dla internationalized resource identifiers czyli IRIs)
rif:local (dla stałych symboli, nie widocznych poza poszczególymi zestawami formuł RIF)
warunek RIF-BLD
reguła RIF-BLD
Serializacja XML dla przenoszalności RIF
Serializacja XML dla składni prezentacji RIF-BLD zaprezentowana w tej sekcji jest z nią przemienna. Naśladując Javę i RDF, używamy nazw pisanych dużymi literami dla elementów klas oraz nazw które zaczynają się od małej litery dla elementów ról.
Wszystkie klasy zapisywane dużymi literami w składni prezentacji, jak CONDITION, stają się tagami (?) XMLa. Zachowują się jak makra i nie są widoczne w instance markup.
Zacznijmy od serializacji Języka Warunkowego w XMLu:
Klasy, role i ich zamierzone znaczenie
- And (conjunction)
- Or (disjunction)
- Exists (quantified formula for 'Exists', containing declare and formula roles)
- declare (declare role, containing a Var)
- formula (formula role, containing a CONDITION formula)
- Uniterm (term or atomic formula, positional or with named arguments)
- Member (member formula)
- Subclass (subclass formula)
- Frame (Frame formula)
- object (Member/Frame role containing a TERM or an object description)
- op (Uniterm role for predicates/functions as operations)
- arg (argument role)
- upper (Member/Subclass upper class role)
- lower (Member/Subclass lower instance/class role)
- slot (Uniterm/Frame slot role, prefix version of slot infix ' -> ')
- Equal (prefix version of term equation '=')
- side (Equal left-hand side and right-hand side role)
- Const (slot, individual, function, or predicate symbol, with optional 'type' attribute)
- Var (logic variable)
Składnia XML dla przestrzeni symboli wykorzystuje atrybut type związany z elementami term, jak Const. Na przykład literał w xsd:dateTime data type może być przedstawiony jako <Const type=„xsd:dateTime”>2007-11-23T03:55:44-02:30</Const>.
Przykład 3
Przykład ten obrazuje serializację XML dla warunkór RIFa.
Serializacja języka reguł
Jest to rozszerzenie Języka Warunkowego poprzez serializację reguł RIF-BLD. Element Forall zawira role elements declare and formula, które były wcześniej wykorzystywane w elemencie Exists. Element Implies zawiera role elementów if oraz then rozróżniające te dwie części reguły.
Klasy, role i ich zamierzone znaczenie
- Ruleset (rule collection, containing rule roles)
- Forall (quantified formula for 'Forall', containing declare and formula roles)
- Implies (implication, containing if and then roles)
- if (antecedent role, containing CONDITION)
- then (consequent role, containing a Uniterm, Equal, or Frame)
Przykład 4
Przykład przedstawia warunek z przykładu 2a zapisany za pomocą XML'a:
Przemyślenia dotyczące reguł zawierających przypisanie
Przeglądając dokumentacje RIF'a nie znalazłem wzmianki o operacji przypisania. Jedną z metod, byłoby zaproponowanie zaimplementowanie predykatu fn:assign(A,B) przypisującego elementowi A wartość elementu B. Wydaje mi się, że ze względu na trwające ciągle prace nad formatem kwestia ta pozostaje otwarta i można przyjąć, że taki warunek jest formułowalny w RIF'ie.
Proponowany przeze mnie zapis wyglądał by tak:
<Ruleset>
<rule>
<declare><Var>A</Var></declare>
<declare><Var>B</Var></declare>
<declare><Var>C</Var></declare>
<formula>
<Implies>
<if>
<formula>
<Uniterm>
<op><Const type="rif:iri">op:numeric-lesser-than</Const></op>
<arg><Var>A</Var></arg>
<arg>
<Uniterm>
<op><Const type="rif:iri">op:numeric-add</Const></op>
<arg><Const type="">3</Const></arg>
<arg><Var>B</Var></arg>
</Uniterm>
</arg>
</Uniterm>
</formula>
</if>
<then>
<Uniterm>
<op><Const type="rif:iri">fn:assign</Const></op>
<arg><Var>C</Var></arg>
<arg><Var>B</Var></arg>
</Uniterm>
</then>
</Implies>
</formula>
</rule>
</Ruleset>
Poniższe propozycje zapisu XTT za pomocą RIFa są oparte na proponowanym XTTMLu i są z nim zestawione. Jest to wstępna wersja, która zostanie dopracowana.
XTTML | RIF |
<xtt_table id="xtt_1">
...
</xtt_table>
| <Group id="xtt_1">
...
</Group>
|
<rule id="rul_1">
...
</rule>
| <sentence id="rul_1">
...
</sentence>
|
<schema>
<independent>
<attref ref="att_0"/>
</independent>
<dependent>
<attref ref="att_1"/>
</dependent>
</schema>
...
| <Forall>
<declare><Var>att_0</Var></declare>
<declare><Var>att_1</Var></declare>
...
</Forall>
|
<condition>
...
</condition>
| <formula>
<Implies>
<if>
...
</if>
...
</Implies>
|
<decision>
...
</decision>
<link xtt="xtt_1"/>
| |
Przykład 1: calculations (factorial)
|----------------------------------------------------|
| |
| x s || s |
|->------------ x y s || y |
NA ||=x --+------> ------------------- |
>0 ||=s-1 --| || |
>0 >0 || =y*s -----|
=0 || =1 -----------|
>0 =1 || -----------+------>
<Group id="xtt_table1">
<sentence id="xtt_table1_row1">
<Implies>
<if>
<External>
<content>
<Atom>
<op><Const type="rif:iri">fn:is_empty</Const></op>
<arg><Var>x</Var></arg>
</Atom>
</content>
</External>
</if>
<then>
<Atom>
<op><Const type="rif:iri">xtt:concl</Const></op>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">xtt:next_table</Const></op>
<arg><Const type="xsd:string">xtt_table2</Const></arg>
</Expr>
</content>
</External>
</arg>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">op:assign</Const></op>
<arg><Var>s</Var></arg>
<arg><Var>x</Var></arg>
</Expr>
</content>
</External>
</arg>
</Atom>
</then>
</Implies>
</sentence>
<sentence id="xtt_table1_row2">
<Implies>
<if>
<External>
<content>
<Atom>
<op><Const type="rif:iri">op:numeric-greater-than</Const></op>
<arg><Var>s</Var></arg>
<arg><Const type="xsd:decimal">0</Const></arg>
</Atom>
</content>
</External>
</if>
<then>
<Atom>
<op><Const type="rif:iri">xtt:concl</Const></op>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">xtt:next_table</Const></op>
<arg><Const type="xsd:string">xtt_table2</Const></arg>
</Expr>
</content>
</External>
</arg>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">op:assign</Const></op>
<arg><Var>s</Var></arg>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">op:numeric-substract</Const></op>
<arg><Var>s</Var></arg>
<arg><Const type="xsd:decimal">1</Const></arg>
</Expr>
</content>
</External>
</arg>
</Expr>
</content>
</External>
</arg>
</Atom>
</then>
</Implies>
</sentence>
</Group>
<Group id="xtt_table2">
<sentence id="xtt_table2_row1">
<Implies>
<if>
<And>
<formula>
<External>
<content>
<Atom>
<op><Const type="rif:iri">op:numeric-greater-than</Const></op>
<arg><Var>x</Var></arg>
<arg><Const type="xsd:decimal">0</Const></arg>
</Atom>
</content>
</External>
</formula>
<formula>
<External>
<content>
<Atom>
<op><Const type="rif:iri">op:numeric-greater-than</Const></op>
<arg><Var>s</Var></arg>
<arg><Const type="xsd:decimal">0</Const></arg>
</Atom>
</content>
</External>
</formula>
</And>
</if>
<then>
<Atom>
<op><Const type="rif:iri">xtt:concl</Const></op>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">xtt:next_table</Const></op>
<arg><Const type="xsd:string">xtt_table1</Const></arg>
</Expr>
</content>
</External>
</arg>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">op:assign</Const></op>
<arg><Var>y</Var></arg>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">op:numeric-multiply</Const></op>
<arg><Var>y</Var></arg>
<arg><Var>s</Var></arg>
</Expr>
</content>
</External>
</arg>
</Expr>
</content>
</External>
</arg>
</Atom>
</then>
</Implies>
</sentence>
<sentence id="xtt_table1_row2">
<Implies>
<if>
<Equal>
<side><Var>x</Var></side>
<side><Const type="xsd:decimal">0</Const></side>
</Equal>
</if>
<then>
<Atom>
<op><Const type="rif:iri">xtt:run_many</Const></op>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">op:assign</Const></op>
<arg><Var>y</Var></arg>
<arg><Const type="xsd:decimal">1</Const></arg>
</Expr>
</content>
</External>
</arg>
<arg>
<External>
<content>
<Expr>
<op><Const type="rif:iri">xtt:return</Const></op>
<arg><Var>s</Var></arg>
<arg><Var>x</Var></arg>
<arg><Var>y</Var></arg>
</Expr>
</content>
</External>
</arg>
</Atom>
</then>
</Implies>
</sentence>
<sentence id="xtt_table2_row3">
<Implies>
<if>
<And>
<formula>
<External>
<content>
<Atom>
<op><Const type="rif:iri">op:numeric-greater-than</Const></op>
<arg><Var>x</Var></arg>
<arg><Const type="xsd:decimal">0</Const></arg>
</Atom>
</content>
</External>
</formula>
<formula>
<Equal>
<side><Var>s</Var></side>
<side><Const type="xsd:decimal">1</Const></side>
</Equal>
</formula>
</And>
</if>
<then>
<Atom>
<op><Const type="rif:iri">xtt:return</Const></op>
<arg><Var>s</Var></arg>
<arg><Var>x</Var></arg>
<arg><Var>y</Var></arg>
</Atom>
</then>
</Implies>
</sentence>
</Group>
Obie tablice w formacie xml: factorial.xml, factorial1.xml
Powyższy przykład został zwalidowany za pomocą dostępnych arkuszy XSD. Jedyny element, który zgłasza błędy jest to parametr id
, aczkolwiek ze względu na brak walidacji niektórych przykładów obecnych w dokumentacji, nie należy się tym przejmować. Nigdzie w dokumentacji nie ma wyraźnego zakazu wykorzystywania elementów standardu XML.