Получите несколько решений в SWI-Prolog

Я новичок в SWI-Prolog (но имею некоторый опыт работы с Borland Prolog), и я столкнулся со странным поведением следующего тестового кода:

test(10).
test(1).

Ожидается, что запрос ?-test(A) получит 2 решения, что-то вроде A = 10; A = 1. Однако производится только A = 10. Я здесь не использую разрез. Может быть, в SWI-Prolog по умолчанию откат с возвратом отключен?

заранее спасибо


person Spectorsky    schedule 04.06.2017    source источник
comment
когда A=10 вернул пресс ;, чтобы получить другие решения и так далее ...   -  person coder    schedule 04.06.2017
comment
Кодер, большое спасибо за ответ и извините за глупый вопрос. Я не ожидал, что нужно нажимать пробел или точку с запятой после каждого решения, и нажал Return.   -  person Spectorsky    schedule 04.06.2017


Ответы (2)


К сожалению, ответ очень прост (см. документ SWI-Prolog):

Пользователь может ввести точку с запятой (;) или пробел, если он хочет другое решение. Используйте клавишу возврата, если не хотите видеть больше ответов. Пролог завершает вывод точкой (.), Если пользователь использует клавишу возврата или Пролог знает, что ответов больше нет. Если Пролог не может найти (больше) ответов, он пишет false.

person Spectorsky    schedule 04.06.2017
comment
Руководство является отличным источником информации о том, как работают основные аспекты SWI Prolog. - person lurker; 04.06.2017
comment
Когда следует вводить точку с запятой? После ввода такого запроса, как ?-pred(X)., я должен нажать клавишу ВВОД, чтобы получить решение, которое также приводит меня к новой строке, где я могу ввести только после ?-, как если бы это был другой запрос. - person user289661; 30.10.2018
comment
user289661, введите точку с запятой после получения решения, если вы хотите получить другие решения. Если вам не нужны другие решения, нажмите клавишу ВВОД. - person Spectorsky; 04.11.2018

Возможно, вы ищете bagof / 3.

?- bagof(X, test(X), Xs).

где Xs - это список всех совпадающих результатов.
Знайте, что анонимные переменные не работают так, как вы могли бы ожидать от bagof. В следующем примере:

test(1,odd).
test(2,even).
test(3,odd).
test(4,even).

bagof(X, test(X,_), Xs) даст значения X только там, где второй член является однородным; в этом случае только четные числа. Если вы хотите вернуть все совпадающие значения, вам нужно сделать что-то вроде

?- bagof(X, A^test(X,A), Xs).
person Jordan C.M.    schedule 01.12.2019
comment
Джордан К.М., спасибо за ответ. Еще есть findall, спасибо. Я искал способ увидеть несколько решений с консоли, но ваша информация полезна, еще раз спасибо. - person Spectorsky; 03.12.2019