Объяснил член пролога + предикат - PullRequest
0 голосов
/ 19 мая 2018

Мне трудно понять участника + предикатный вызов.Например, когда у меня есть предикат, подобный этому:

predicate(List) :- member(X, List), someCalculations(X).

И давайте предположим, что предикат someCalculations(X) иногда возвращает истину, а иногда ложь, или просто ложь / истина.Будет ли остановлено первое возвращенное значение true или когда все члены X из списка вернут значение true?И когда он потерпит неудачу, когда он столкнется с ошибкой один раз или когда все члены списка потерпели неудачу?

1 Ответ

0 голосов
/ 19 мая 2018

Предикатные вызовы в Прологе не «возвращают false / true»;они успешны (необязательно обязательные переменные) или терпят неудачу .И они могут преуспеть многократно.

Ответ на ваш вопрос зависит от того, как вы позвоните predicate.Предполагая, что это само по себе цель, и вы передаете ему список, не содержащий несвязанных переменных, например, ?- predicate([a,b,c,d]), это произойдет:

  1. member(X,[a,b,c,d]) сначала успешно с X=a.Затем вызывается someCalculations(a).

    1. В случае успеха вызов predicate([a,b,c,d]) также выполняется успешно, без привязки каких-либо переменных.Вы можете остановиться или запросить дополнительные результаты, в этом случае ...

    2. В случае неудачи пролог возвращается и ...

  2. ... X привязывается к b, вызывается someCalculations(b).И т. Д.

После шага 4 (с d), вызов member завершается неудачно, так же как и вызов predicate (someCalculations не вызывается).

...