Член пролога не найден - PullRequest
0 голосов
/ 16 мая 2018

Я определил код в PROLOG:

is_member(X, [X|_]).
is_member(X, [_|T]) :-
    is_member(X, T).

Меня смущают эти два выхода:

out1:

is_member('a', ['b', 'c', 'd', 'a']).
>> True.

out2:

Chars = ['b', 'c', 'd', 'a'].
is_member('a', Chars).
>> Chars = [a|_2356]

Может кто-нибудь помочь мне здесь?Я думаю, что вывод должен быть True..Я пытаюсь понять логику здесь, но, очевидно, я потерян.

Спасибо за любую помощь или совет заранее.

1 Ответ

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

Вот как в основном работают запросы 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 ).

...