Как удалить решения из программы Prolog - PullRequest
3 голосов
/ 20 июня 2019

Для данной программы:

a(1). a(2). a(3).
b(1). b(2). b(3).
ab(A, B) :- a(A), b(B).

Этот запрос возвращает 9 элементов:

ab(A, B).

Как удалить некоторые конкретные строки, например, строки (1,2) и (3,1) и получить этот результат?

1 1
1 3
2 1
2 2
2 3
3 2
3 3

1 Ответ

2 голосов
/ 20 июня 2019

Вы можете закодировать список значений для A и B, которые вам не нужны, например:

not_ab(1,2).
not_ab(3,1).

Затем вы можете использовать предикат \+/1 [swi-doc] , который действует как отрицание:

ab(A, B) :-
    a(A),
    b(B),
    \+ not_ab(A, B).

Обратите внимание, что отрицание Пролога отрицание как конечный отказ . Таким образом, это означает, что \+ Goal успешен, все попытки удовлетворить Goal терпят неудачу, и что эти попытки конечны (как, например, программа не застревает в бесконечном цикле, а число ветвей конечно).

Выше приведен подход генерация-и-тестирование : сначала мы генерируем значения для A и B, а затем тест , если они действительный. Однако, если вы уже знаете, что для данного значения для A все значения B не пройдут, тогда лучше чередовать тестирование. Здесь, однако, похоже, что мы можем только проверить, известны ли и A, и B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...