Вы можете использовать минимальную логику, чтобы определить отрицательную голову. В минимальной логике
~ A можно рассматривать как A -> ff. Таким образом, следующее
P -> ~Q
Можно рассматривать как:
P -> (Q -> ff).
Теперь, если мы возьмем следующее тождество (A -> (B -> C)) = (A & B -> C), мы
видим, что вышеупомянутое эквивалентно:
P & Q -> ff.
Теперь есть одна проблема, как мы можем задавать отрицательные запросы? Есть один
способ использовать минимальную логику, которая отличается от отрицания как
отказ. По идее, это запрос вида:
G |- A -> B
временно добавляется A в программу пролога G, а затем
пытаясь решить B, т.е. делать следующее:
G, A |- B
Теперь давайте обратимся к нотации Пролога, покажем, что p, а p -> ~ q
подразумевает ~ q, выполняя (минимальную логику) программу Prolog.
Пролог программы:
p.
ff :- p, q.
И запрос:
?- q -: ff.
Сначала нам нужно определить новое связующее (-:) / 2. Быстрое решение
выглядит следующим образом:
(A -: B) :- (assert(A); retract(A), fail), B, (retract(A); assert(A), fail).
Здесь вы видите реализацию этого минимального логического отрицания в SWI Prolog:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.4)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
1 ?- [user].
:- op(1200,xfy,-:).
|: (A -: B) :- (assertz(A); retract(A), fail), B, (retract(A); assertz(A), fail).
|: p.
|: ff :- p, q.
|:
% user://1 compiled 0.02 sec, 1,832 bytes
true.
2 ?- q -: ff.
true .
С наилучшими пожеланиями
Ссылка:
Унифицированные доказательства как основа логического программирования (1989)
Дейл Миллер, Гопалан Надатур, Фрэнк Пфеннинг, Андре Счедров