2013-05-01 2 views
0

Мой преподаватель дал нам пример программы, чтобы посмотреть на код, в то время как я понял рекурсивную функцию в целом была эта одна линия я не мог понять смыслЧто делает эта строка кода точно? (Пролог)

all_different([H | T]) :- member(H, T), !, fail. 

извлеченный из рекурсивная функция:

all_different([H | T]) :- member(H, T), !, fail. 
all_different([_ | T]) :- all_different(T). 
all_different([_]). 

все, что я понял о нем, что он разбивает список в голове H и хвост T и проверяет, если Н содержится в Т ... Мой вопрос, что это такое, что " !» и «провалиться»?

ответ

3

Эти вещи очень важны для Prolog.

fail Важна. Это заставляет Prolog рассматривать текущую ветвь сбой и инициирует обратное отслеживание.

! называется «разрез». Он передает Пролог текущей ветке. Или, это сушит след точек выбора в соответствии с действующим правилом.

В документе Prolog-ese сказано: «Если глава списка присутствует в хвосте списка, нет необходимости искать какие-либо дополнительные ответы и терпеть неудачу». Таким образом, если какой-либо элемент списка присутствует в остатке списка, вы получите немедленный сбой без каких-либо шансов на возврат. На самом деле это не так страшно, это просто означает, что Prolog больше не будет тратить время на то, чтобы выяснить, является ли список «all_different». Откат будет возобновлен на обычном сайте вызова.

Важно, чтобы все было в порядке. Если вы попытаетесь вырезать после неудачи, вы никогда не попадете на срез, потому что откат уже начался. Если вы опустите сокращение, предикат вернет true, если есть какой-либо подсписк списка, который удовлетворяет свойству. Это гарантируется для любого непустого списка по последнему предложению, в котором утверждается, что список с одним элементом удовлетворяет свойству. Если вы опустите неудачу, вы просто получите один успех для каждого элемента списка, который находится в подсписке, плюс один для хвоста. Я рекомендую вам попробовать поиграть с предикатом, внести эти изменения и увидеть эффекты, потому что это проделает длинный путь, чтобы показать цель сокращения и потерпеть неудачу.

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