next up previous Sommario
Next: 6.2.2.2 Negazione intensionale Up: 6.2.2 Traduttore Previous: 6.2.2 Traduttore   Sommario

6.2.2.1 Analizzatore

L'analizzatore partizionerà l'insieme dei predicati del programma in base a condizioni sufficienti per la terminazione. Infatti, a causa della nota indecidibilità dell' halting problem, le tecniche effettive di decisione sulla terminazione dei programmi possono verificare solamente criteri sufficienti ma non necessari.

È auspicabile, per l'efficienza del metodo di negazione, che le tecnica usata identifichi una classe di programmi terminanti che approssimi il meglio possibile la classe dei programmi che effettivamente terminano.

Qui di seguito esporremo un criterio che verifica condizioni sufficienti per la terminazione di programmi normali stratificati nvi, left linear, i cui predicati non siano mutuamente ricorsivi (tale ultima ipotesi non è affatto restrittiva perchè con tecniche di unfolding ogni programma mutuamente ricorsivo può essere trasformato in un altro equivalente non mutuamente ricorsivo).

Definizione 6.4   Dato l'atomo $p(t_{1}, \ldots, t_{n})$, definiamo $ground\_args(p(t_{1}, \ldots, t_{n})) $ = { $t_{i} \mid t_{i}$ è ground }. Inoltre, definiamo $nonground\_args(p(t_{1}, \ldots, t_{n})) $ = $\{t_{1}, \ldots, t_{n} \} \setminus {\em ground\_args(p(t_{1}, \ldots, t_{n}))}$

Definizione 6.5  

Dato un atomo $p(t_{1}, \ldots, t_{n})$ e un modo $d_{p}$, definiamo $nonground\_input(p(t_{1}, \ldots, t_{n}))$ = { $t_{i} \mid t_{i} \in
nonground\_args(p(t_{1}, \ldots, t_{n})) \wedge d_{p}(i) = '+' $}.

Il criterio stabilisce se una query del tipo $\leftarrow p(\bar{t})$ termina rispetto ad un modo $d_{p}$. Per i nostri scopi, sarà necessario applicarlo a ogni query del tipo $\leftarrow p(\bar{x})$, $\forall d_{p}$, $\forall p \in \Pi$. In questo modo si otterrà la partizione di $\Pi$ desiderata, in base alle proprietà di terminazione dei predicati in $\Pi$ per goal totalmente non ground.

Il criterio testa la terminazione di una particolare query e non di un generico predicato essenzialmente per utilizzare le informazioni che si ottengono durante l'applicazione del criterio stesso.

Infatti, poiché la verifica di terminazione di una query richiederà in generale (cioè quando non si ha a che fare con clausole unitarie) l'applicazione ricorsiva del criterio, tale applicazione potrà essere più mirata nel senso di utilizzare le informazioni sugli argomenti della query, che saranno contenute nella sostituzione $\theta$ iniziale.

Esempio 6.4  

Dato il programma

\begin{displaymath}p(x) \leftarrow r(x), q(x) \end{displaymath}


\begin{displaymath}r(1) \leftarrow \end{displaymath}


\begin{displaymath}q(x) \leftarrow \ldots \end{displaymath}

l'applicazione del criterio alla query $\leftarrow p(x)$ renderà sufficiente, una volta stabilito che la query $\leftarrow r(x)$ termina per x=1, verificare la terminazione della query $\leftarrow q(1)$.

Il criterio consiste essenzialmente in una applicazione accorta della risoluzione SLDCNF, nel senso che si procede al passo successivo di risoluzione solo quando sono verificate condizioni sufficienti alla terminazione. In effetti i casi critici sono quelli di clausole ricorsive: in tal caso deve essere verificata una particolare condizione sulle norme degli argomenti del predicato che ricorre.

Definizione 6.6   Criterio

Una query del tipo $\leftarrow p(\bar{t})\theta$ termina, rispetto al modo $d_{p}$, con risposte $(\sigma_{1}, v_{1}), \ldots , (\sigma_{k}, v_{k})$, dove $\sigma_{i}$ è una sostituzione e $v_{i}$ è un insieme di vincoli (diseguaglianze soddisfacibili o primitive), nel caso in cui:

Una query del tipo $\leftarrow (p_{1}(\bar{t}_{1}), \ldots, p_{n}(\bar{t}_{n})) \theta$ termina senza risposta se $(p_{1}(\bar{t}_{1})) \theta$ è una diseguaglianza insoddisfacibile, altrimenti termina con risposte $(\sigma_{1}, v_{1}), \ldots , (\sigma_{k}, v_{k})$ se $\leftarrow (p_{1}(\bar{t}_{1})) \theta$ termina con risposta $(\sigma_{11}, v_{11}), \ldots , (\sigma_{1k_{1}}, v_{1k_{1}})$ e $\leftarrow v_{1j}(p_{2}(\bar{t}_{2}), \ldots, p_{n}(\bar{t}_{n})) \theta \circ \sigma_{1j}$, $1 \leq j \leq k_{1}$, terminano con risposte $(\sigma_{1}, v_{1}), \ldots , (\sigma_{k}, v_{k})$.

Una clausola che unifica con $p(\bar{t}) \theta$ se è della forma :

Teorema 6.2 (Terminazione del criterio)  

Dato un programma P e la query $\leftarrow (p_{1}(\bar{t}_{1}),\ldots,p_{n}(\bar{t}_{n}))\theta $, il criterio applicato a tale query termina.



dim. (per induzione sulla lunghezza della query)

Il criterio applicato a $\leftarrow (p_{1}(\bar{t}_{1}),\ldots,p_{n}(\bar{t}_{n}))\theta $ termina perché $p_{1}(\bar{t}_{1})\theta$ è una disuguaglianza insoddisfacibile oppure perché termina applicato alle queries $\leftarrow p_{1}(\bar{t}_{1})\theta$ e $\leftarrow ( v_{1j}, p_{2}(\bar{t}_{2}), \ldots, p_{n}(\bar{t}_{n})) \theta \circ \theta_{1j}$.

Quindi è sufficiente dimostrare che il criterio termina se viene applicato alla query del tipo $\leftarrow p(\bar{t})\theta$.

In questo caso termina:

Infatti se:

$\quad\Box$

Teorema 6.3 (Correttezza del criterio)  

Dato un programma P, la query $\leftarrow (p_{1}(\bar{t}_{1},\ldots,\bar{t}_{n}))\theta $ termina con risposte $(\sigma_{1},v_{1}), \ldots, (\sigma_{k},v_{k})$

$\Rightarrow $ tale query ha un albero di derivazione SLDCNF finito con sostituzioni di risposta $\sigma_{1}, \ldots, \sigma_{k}$ e diseguaglianze primitive $v_{1}, \ldots, v_{k}$.



dim. (per induzione sulla struttura del programma e della query)

Consideriamo il caso in cui la query sia del tipo $\leftarrow (p_{1}(\bar{t}_{1}) ,\ldots,p_{n}(\bar{t}_{n}))\theta $, con $n > 1$.

Se valgono le condizioni del criterio, si può avere che:

Dimostriamo ora che una query del tipo $\leftarrow p(\bar{t}) \theta$ termina, se valgono le condizioni del criterio;

$\quad\Box$

La verifica della relazione sulle norme per tutti gli argomenti di una chiamata ricorsiva potrebbe sembrare una condizione troppo forte e si potrebbe pensare di limitarla solo alle posizioni di input. Il seguente esempio fa vedere che tale condizione è necessaria per mantenere la correttezza del criterio:

Esempio 6.5  

Considerando la definizione dei numeri pari data dalle clausole

\begin{displaymath}pari(0). \end{displaymath}


\begin{displaymath}pari(s(s(x))) \leftarrow pari(x) \end{displaymath}

sulla segnatura $\Sigma = \{0 : Nat, S : Nat \rightarrow Nat \}$, se l'utente volesse usarla per generare tutti i numeri pari fornirebbe il modo $d_{pari} = (-)$. Se il criterio controllasse la relazione sulle norme solo per le posizioni di input, stabilirebbe che la query $\leftarrow pari(x)$ termina, errando. D'altra parte il predicato $pari$ va trattato con la negazione intensionale.


next up previous Sommario
Next: 6.2.2.2 Negazione intensionale Up: 6.2.2 Traduttore Previous: 6.2.2 Traduttore   Sommario
Roberto Giungato 2001-03-14