Работа с логическими функторами в Прологе

Я хочу иметь логические связки, такие как

not(X), conj(X, Y), some(Y, K)., и я хочу иметь возможность перебирать их.

Так, например, я хочу иметь возможность конвертировать не (некоторые (Y, K)), во все (Y, не (K)).

Я не хочу, чтобы они имели какое-то конкретное значение, я просто хочу работать с логическими формулами таким образом.

Как лучше всего это сделать?

Вот реальная строка в моем коде:

nnf(not(all(X, Y)) ,some(Z, W))     :- nnf(X, Z), nnf(not(Y), W).

Поэтому, если я дам ему not(all(a,b)), я хочу получить обратно некоторое (а, а не (b)), но я не знаю, как заставить Пролог обрабатывать not/1 и all/2 таким образом.


person user1066113    schedule 25.11.2011    source источник


Ответы (2)


Здесь нет единственного лучшего способа. Это немного зависит от вашего конкретного использования.

Ваш вопрос по существу сводится к следующему: как переменные должны быть представлены в вашей настройке. По основному сроку? Это (Пролог) свободное представление переменной. Или напрямую переменными Пролога.

Я бы предпочел сначала попробовать наземное представление. Возможно, попробуйте v(Nr) с Nr целым числом. Относительно частым является '$VAR'(Nr), который также распознается writeq/1. Но я бы остановился на v/1 в начале.

person false    schedule 25.11.2011
comment
Эй, спасибо за быстрый ответ. Но я не очень понимаю, что вы имеете в виду. Мне нужно иметь возможность сделать что-то подобное, дать что-то вроде не (некоторые (а, б)) функции и вернуть все (а, не (б)). - person user1066113; 25.11.2011
comment
ваша_функция(не(некоторые(X, Y)), все(X, не(Y))). достаточно для данного конкретного случая. Что бы вы хотели обобщить? - person m09; 26.11.2011

Взгляните на проект Thea. Он разрабатывает библиотеку Prolog для управления онтологиями OWL2. Возможно, они уже внедрили преобразование отрицания в нормальную форму.

person Kaarel    schedule 26.11.2011