У меня проблемы с чем-то. Я написал функцию, которая возвращает количество вхождений элемента в список. Вот код:Prolog: подсчет вхождений элемента в список, возвращающий несколько ответов
occurencesHelp(X,[],N,N).
occurencesHelp(X,[X|T],N,Y) :-
N1 is N+1,
occurencesHelp(X,T,N1,Y).
occurencesHelp(X,[H|T],N,Y) :-
occurencesHelp(X,T,N,Y).
occurences(X,List,N) :-
occurencesHelp(X,List,0,N).
Это работает отлично, первый ответ, который я получаю:
N = 5 ?
но есть несколько ответов, таких как:
N = 4 ? ;
N = 4 ? ;
N = 3 ? ;
N = 4 ? ;
N = 3 ? ;
и так далее. Я пробовал отслеживать, чтобы посмотреть, могу ли я понять, почему это так, но не могу понять. Я думаю, что использование разреза поможет мне, но нам специально сказали не использовать разрез, так что это не вариант. Любая помощь будет оценена по достоинству.
Спасибо.
Большое спасибо за ответ, добавив X \ = H действительно исправляет проблему. Просто для ясности, почему это нужно явно указывать? Из того, что я понимаю, если X = H, то он будет использовать предложение, которое увеличивает счетчик, а если X \ = H, то он будет следовать условию, которое сохраняет его неизменным. Почему существует экземпляр предложения, который сохраняет счетчик без изменений с помощью X = H? Извините, если это тривиально, просто пытаясь обернуть мою голову. Благодарю. – Faz
@Faz, потому что случай 'X = H' будет соответствовать обоим случаям, если ваш второй случай явно не применяет' X \ = H'. Помните: Prolog ищет * все * возможные решения, соответствующие вашим правилам. – lurker