2017-02-13 18 views
0

Мне интересно, почему предикат Prolog предлагает множество альтернатив (с помощью backtracking ?!), если истина уже была унифицирована для вывода.Prolog: истинный/ложный вывод предиката члена?

Например member(1, [1,2,3]). обеспечивает следующий вывод:

true ; 
false. 

Почему member возвращение ложным после того, как уже выяснилось, что атом 1 действительно является членом списка [1,2,3]?

Еще более запутанной для меня является следующий вывод:

?- member(1, [1,2,3,1]). 
true ; 
true. 
+0

какая реализация Пролога вы используете? –

+0

Я использую Swi-Prolog. – daniel451

+0

Улучшение - ['memberd/2'] (http://stackoverflow.com/a/21971885/772868). – false

ответ

5

В первом примере, вы просите его, чтобы доказать member(1,[1,2,3]).; поскольку он может, он сообщает true. Когда вы вводите ;, вы просите найти другой способ доказать этот запрос; поскольку он не может, он сообщает false.

Во втором случае первый true является потому, что он нашел один из 1 в списке; второй - потому, что он нашел вторую. Если бы вы снова нажали ;, он вернулся бы с false, так как у него не было других способов доказать запрос. (Примечание. Как указывает @WillNess, вы на самом деле не получаете шанс снова нажать ;, это, вероятно, связано с тем, что реализация member такова, что Prolog знает, что альтернатив нет. Если список не заканчивается 1, вы могли бы снова нажать ;.)

 Смежные вопросы

  • Нет связанных вопросов^_^