Я учусь Пролог для университетского экзамена с помощью SWI Prolog и у меня есть некоторые сомнения по поводу различий между двумя различными решения следующей задачи:Некоторые вопросы об использовании CUT в этой Prolog упражнения
Определи пункт граф (X, L, NumX), где Х представляет собой атом, L представляет собой перечень и NumX это число вхождений, что Х появляется в L.
Это первое решение:
count0(_,[],0).
count0(A, [A|Tail], N) :-
count0(A,Tail,N1), % L'elemento cercato appare N1 volte nella sottolista
N is N1+1. % N vale N1+1
count0(A, [B|Tail], N) :-
A\=B, % A è diverso da B
count0(A,Tail,N). % N è il numero di occorrenze di A nella sottolista
Это второе решение:
count1(_,[],0).
count1(A, [A|Tail], N) :- !,
count1(A, Tail, N1),
N is N1+1.
count1(A, [_|Tail], N) :- count1(A, Tail, N).
Моя проблема заключается в том, что я не понимая, какую роль она играет в CUT во второй версии
Я знаю, что CUT предотвращает откат в определенную точку, где выполняется CUT.
Первая версия программы проверяет, отлична ли A от B во втором правиле (мне нужно это? Если первое правило не выполнено, это означает, что A не объединяется с HEAD списка, поэтому Глава списка он отличается от элемента а)
Вторая версия не выполняет эту проверку во втором правиле, но поставить сокращение в первом правиле ...
это может быть, зависит от тот факт, что (во второй версии), если я не предотвращаю обратное отслеживание, происходит следующее: после этого Prolog дает мне первый (правильный) ответ, если я принудительно использую backtracking; бывает, что используют второе правило:
count1(A, [_|Tail], N) :- count1(A, Tail, N).
принимая другую ветвь в вычислениях и в этой отрасли я не имею N не является N + 1?
Хорошо, теперь для меня это более понятно ... последний вопрос: во второй версии программы (которая использует разрез) порядок правила важен, правильно? – AndreaNobili
@AndreaNobili: Да, это важно. Если вы поменяете два последних предложения, вы получите неверные результаты (а также правые). – gusbro