next up previous Sommario
Next: 5.3 NI per programmi Up: 5. Operatori su teorie Previous: 5.1 Unione e intersezione   Sommario

5.2 Differenza tra programmi

Per raggiungere l'obbiettivo di fornire un ricco insieme di combinatori, è necessario avere a disposizione, oltre agli operatori di unione e di intersezione, altri operatori per ritrarre conoscenza da un programma. Questi potranno essere utili, per esempio, per costruire programmi che tengono conto di eccezioni, a partire da programmi che rappresentano la normale conoscenza su un particolare problema. Infatti l'insieme delle eccezioni sarà il programma da sottrarre al programma di partenza.

Un primo operatore (Retract Pred) [BMPT90] che può essere definito è quello che permette di eliminare da un dato programma $P$ tutte le clausole che definiscono un particolare predicato $p$. Tale operatore sarà denotato da $Q - p$, dove $Q$ è un programma e $p $ è il nome di un predicato.

Definizione 5.3 (semantica rispetto all'operatore di conseguenza immediata)  


\begin{displaymath}T_{Q - p} = \lambda I. T_{Q}(I) \backslash \{ L \mid \ unifica \ con \ p(\_) \} \end{displaymath}

dove $\backslash $ denota la differenza tra insiemi.

Definizione 5.4 (definizione trasformazionale)  

Dato un programma $Q$ e un simbolo di predicato $p$, $Q - p$ denota il programma ottenuto da $Q$ nel seguente modo:

Se $ q \leftarrow Body $ è una clausola di $Q$

e $ q \neq p$

allora $ q \leftarrow Body$ è una clausola di $Q - p$.

Questo operatore permette di eliminare l'intera definizione di un predicato.

Utilizzando questo operatore, si possono introdurre due operatori su teorie per modellare relazioni gerarchiche tra due teorie [BMPT90]. Nel seguito, date due teorie $T_{i}$ e $T_{j}$, $preds_{ij}$ indica l'insieme di predicati che sono definiti in entrambe le teorie.

is_a($T_{i}$, $T_{j}$)
$T_{i}$ è la SUB teoria e $T_{j}$ è la SUPER teoria. La teoria risultante contiene tutte le definizioni di predicati di $T_{i}$ ed eredita le definizioni di predicati occorrenti in $T_{j}$ soltanto.

constraint($T_{i}$, $T_{j}$)
$T_{i}$ è la SUB teoria e $T_{j}$ è la SUPER teoria. La teoria risultante contiene l'intersezione delle definizioni dei predicati in $preds_{ij}$ ed eredita le definizioni dei predicati occorrenti in $T_{j}$ soltanto.

Utilizzando gli operatori già a disposizione, si ottiene la seguente definizione:

Definizione 5.5  

Date due teorie $T_{1}$ e $T_{2}$,


\begin{displaymath}is\_a(T_{1},T_{2}) = T_{1} \cup (T_{2}-preds_{12}) \end{displaymath}


\begin{displaymath}constraint(T_{1},T_{2}) = (T_{1} \cap T_{2}) \cup (T_{2}- preds_{12}) \end{displaymath}

Un'utile estensione può essere la definizione di un altro operatore che ritrae da un programma un altro programma formato da clausole unitarie [BMPT90].

Definizione 5.6  

Dati due programmi $P$ e $Q$, dove $Q$ contiene solo clausole unitarie


\begin{displaymath}T_{P \backslash Q} = \lambda I. T_{P}(I) \backslash \{L \mid \exists L' \in Q: L \ unifica \ con \ L' \} \end{displaymath}

Per dare la definizione trasformazionale di quest'ultimo operatore è necessaria una limitata forma di negazione costruttiva che permetta di negare clausole unitarie.

Definizione 5.7  

Sia $P$ un programma di sole clausole unitarie. Per ogni simbolo di predicato $p$ occorrente in $P$, sia


\begin{displaymath}p(t_{11},\ldots , t_{1n}) \leftarrow\end{displaymath}

$\;\;\;\;\; \;\;$ $\ldots $

\begin{displaymath}p(t_{m1},\ldots , t_{mn}) \leftarrow\end{displaymath}

l'insieme delle m clausole che definiscono il predicato n-ario $p$. Sia $C_{p}$ l'insieme delle clausole


\begin{displaymath}p(x_{1} ,\ldots ,x_{n}) \leftarrow x_{i_{1}} \neq t_{1i_{1}}, \ldots x_{i_{m}} \neq t_{mi_{m}} \end{displaymath}

dove $\{i_{1} ,\ldots ,i_{m} \}$ è un bag di indici in [1,n]. Allora la negazione di $P$, denotata da $P^{-}$, è definita come l'insieme di clausole $C_{p}$ per ogni simbolo di predicato $p$ in $P$.

Quindi la definizione trasformazionale di $\backslash$ è la seguente:

Definizione 5.8  

Sia $P$ un programma e $Q$ un programma di sole clausole unitarie. Allora


\begin{displaymath}P \backslash Q = P_{1} \cup (P_{2} \cap Q^{-}) \end{displaymath}

dove $P = P_{1} \cup P_{2}$ e $P_{1}$ (rispettivamente $P_{2}$) contiene le clausole dei predicati che non sono (rispettivamente sono) definite in $Q$.

Il passo successivo è quello che permette di avere a disposizione un operatore di ritrazione di programmi che contengono anche clausole non unitarie. Ciò è possibile utilizzando la tecnica di negazione intensionale vista nel capitolo precedente.


next up previous Sommario
Next: 5.3 NI per programmi Up: 5. Operatori su teorie Previous: 5.1 Unione e intersezione   Sommario
Roberto Giungato 2001-03-14