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 tutte le clausole che definiscono un particolare predicato
.
Tale operatore sarà denotato da
, dove
è un programma e
è il nome di un predicato.
dove denota la differenza tra insiemi.
Dato un programma e un simbolo di predicato
,
denota il programma ottenuto da
nel seguente modo:
Se
è una clausola di
e
allora
è una clausola di
.
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 e
,
indica l'insieme di predicati che sono definiti in entrambe le teorie.
Utilizzando gli operatori già a disposizione, si ottiene la seguente definizione:
Date due teorie e
,
Un'utile estensione può essere la definizione di un altro operatore che ritrae da un programma un altro programma formato da clausole unitarie [BMPT90].
Dati due programmi e
, dove
contiene solo clausole unitarie
Per dare la definizione trasformazionale di quest'ultimo operatore è necessaria una limitata forma di negazione costruttiva che permetta di negare clausole unitarie.
Sia un programma di sole clausole unitarie. Per ogni simbolo di predicato
occorrente in
, sia
l'insieme delle m clausole che definiscono il predicato n-ario .
Sia
l'insieme delle clausole
dove
è un bag di indici in [1,n].
Allora la negazione di
, denotata da
, è definita come l'insieme di clausole
per ogni simbolo di predicato
in
.
Quindi la definizione trasformazionale di è la seguente:
Sia un programma e
un programma di sole clausole unitarie. Allora
dove
e
(rispettivamente
) contiene le clausole dei predicati che non sono (rispettivamente sono) definite in
.
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.