Короче говоря : потому что false
означает, что после исчерпывающего поиска не может быть найдено никаких (дополнительных) решений.
Почему это произошлодать мне возможность проверить другое решение во втором запросе, но не в первом?
Поскольку, если он выдает false
, это означает, что ему не удалось найти решение после исчерпывающий поиск.Следовательно, это означает: « Я не нашел никаких решений (больше). ».Поэтому после false
не имеет смысла искать дополнительные решения.
Однако, если он предлагает решение, это не означает, что все решения исчерпаны.Таким образом, он может предложить дополнительные решения.В зависимости от оптимизаций, которые имеет интерпретатор Prolog, он может заранее знать, что дополнительных решений нет.Если это не так, он печатает решение, а затем делает паузу.Затем пользователь может запросить дополнительные решения.
Например, если мы напишем:
foo(a, 1).
foo(a, 2).
foo(b, 3).
foo(c, 4).
, тогда запрос с помощью foo(b, 3)
будет, по крайней мере, в SWI-Prolog и, вероятно, в большинстве переводчиков,только скажи true
, а потом знай, что это сделано.Поскольку SWI-Prolog проанализирует функтор / константу первого аргумента и, таким образом, заранее знает, что, если первый аргумент обоснован, других foo/2
с b
в качестве первого аргумента не будет.