Вот как в основном работают запросы Prolog.
Прежде всего, полный запрос заканчивается точкой (.
).Когда вы выполняете:
Chars = [a, b, c, d].
Это полный запрос, поскольку он заканчивается в периоде.Когда вы выполняете запрос, Prolog пытается сделать его успешным через некоторую привязку заданных переменных.Если он сможет это сделать, он просто отобразит привязки переменных, которые приведут к успеху.В данном конкретном случае решение тривиально: Chars
связано с [a, b, c, d]
.
Предположим, вы вводите вышеприведенное, а затем выполняете следующие действия:
is_member(a, Chars).
Поскольку предыдущийзапрос завершен (он закончился за период), Пролог видит эту Chars
как новую переменную.Он больше не связан с [a, b, c, d]
, потому что предыдущий запрос завершен.Пролог просматривает этот запрос и определяет, какие привязки для Chars
приведут к успеху.Результат:
Chars = [a|_2356]
Пролог сообщает вам, что правильное решение получается путем привязки Chars
к списку [a|_2356]
, который является любым списком, в котором a
является его первым элементом.Что вы не показали, так это то, что Prolog предлагает дополнительные решения.Если вы нажмете ;
, он покажет вам больше решений для запроса is_member(a, Chars).
:
3 ?- is_member(a, Chars).
Chars = [a|_5034] ;
Chars = [_5032, a|_5040] ;
Chars = [_5032, _5038, a|_5046] ;
...
Другими словами, is_member(a, Chars)
имеет бесконечное количество решений.Это списки, которые имеют a
в качестве первого элемента, a
в качестве второго и т. Д.
В Prolog, если вы хотите установить ряд условий, которые все должны быть истинными в последовательности, вы используете запятая , а не точка , чтобы отделить каждое условие, а затем завершить все в периоде:
4 ?- Chars = [a,b,c,d], is_member(a, Chars).
Chars = [a, b, c, d] ;
false.
Этот запрос говорит, что вы хотите связать *От 1042 * до [a, b, c, d]
и определяют, является ли a
членом Chars
.Пролог говорит, что ему удалось с одним решением, Chars = [a,b,c,d]
.Ввод ;
ищет другие решения, которые возвращаются false , поскольку дополнительных решений нет.
Давайте попробуем другой пример Изабеллы с x
:
5 ?- Chars = [a,b,c,d], is_member(x, Chars).
false.
В этом случае Пролог не может найти решение, поэтому оно просто терпит неудачу (показывая false ).