2016-01-09 4 views
3

Может ли кто-нибудь объяснить мне, что делает «!» делать в Прологе? Я этого не понимаю. Здесь у меня есть код, который подсчитывает, сколько подсписок в гетерогенном списке имеют горный аспект.Что такое "!" in Prolog

nrSubliste([], 0). 
nrSubliste([H|T], R):- 
    is_list(H), 
    munteMain(H),!, 
    nrSubliste(T, R1), 
    R is R1 + 1. 
nrSubliste([_|T], R):- 
    nrSubliste(T, R). 

munteMain проверяет, имеет ли линейный список горный аспект.

+1

Также проверьте [канонический ответ] (http://stackoverflow.com/a/14556019/1613573), когда использовать ' !/0' в Прологе. – mat

ответ

1

! Восклицательный знак обозначает в Прологе, особой цели, которая всегда удается Cut, и блокирует возвратов для всех ветвей над ней, которые могут иметь альтернативные варианты.

В вашем случае это означает, что после того, как было найдено решение для munteMain/1, программа никогда не будет отступать и искать альтернативное решение. В частности, Prolog никогда не рассмотрит третье положение вашего правила nrSubliste/2, то есть тот, который игнорирует заголовок списка с _, если H во втором предложении таков, что munteMain(H) преуспевает.

Обратите внимание, что использование ! делает ваш код несколько более трудным для чтения и обслуживания, поскольку логика в третьем разделе зависит от логики второго предложения. Вы можете переписать программу без разреза с помощью не доказуемоoperator \+:

nrSubliste([H|T], R):- 
    is_list(H), 
    munteMain(H), 
    nrSubliste(T, R1), 
    R is R1 + 1. 

nrSubliste([H|T], R):- 
    is_list(H), 
    \+ munteMain(H), 
    nrSubliste(T, R). 
+0

Хорошо, я думаю, я это понял и большое спасибо за альтернативу использования оператора \ +. – LauraW