Вы можете закодировать список значений для 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
.