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.