#list #prolog
#Список #пролог
Вопрос:
Я хочу подсчитать, сколько элементов g отображается в списке, ниже приведен код, который я пробовал сейчас, но при возврате я получил false.
g(E) :- memberchk(E, [apple, orange, pear, grape, lycee, pineapple,dragonfruit]).
countFruit([], No):- write(' >> No of Fruits : '), write(No), nl.
countFruit([H|T], No) :- not(g(H)), countFruit(T,No).
countFruit([H|T], No) :- No1 is No 1, countFruit(T,No1).
?countFruit(H,0). (H is a list).
Ответ №1:
Вызывая ?- countFruit(H,0).
, вы указываете prolog объединить No
переменную в вашем countfruit2
предикате с 0
. Таким образом, результатом может быть только 0
or fail
.
Однако, если я выполню ваш код как есть, я получу следующее:
>>NoofFruits:0
Yes.
Вот мой взгляд на эту проблему:
countFruit(Xs, No) :-
countFruit(Xs, No, 0).
countFruit([], No, No).
countFruit([H|T], No, X0) :-
member(H, [apple, orange, pear, grape, lycee, pineapple, dragonfruit]),
!,
X1 is X0 1,
countFruit(T, No, X1).
countFruit([_|T], No, X) :-
countFruit(T, No, X).
?- countFruit([orange, dog, dragonfruit, lycee], X),
write(" >> No of Fruits : "),
write(X),
nl,
fail.
Комментарии:
1. @user236501 — О чем ты хочешь поболтать?
2. Проясните проблемы с элементами печати
3. Не беспокойтесь. Было бы хорошо, если бы вы добавили ссылку на свой новый пост в комментарии здесь.
4. Утверждение «вы указываете prolog объединить переменную No […] в 0. Таким образом, результат может быть только 0 или сбой.» неверно. Переменная No в исходном коде функционирует только как ввод, поэтому нет проблем с привязкой ее к 0. То, что OP не получил решения, должно быть, имело другую причину. Отсюда мой вопрос к запросу OP, который привел к «false». Тем не менее, ваш код лучше, хотя вы должны использовать memberchk/2 вместо member/2, чтобы избежать проблем при вызове countFruit/2 с неустановленным списком.
Ответ №2:
Ваш код содержит одну ошибку: поскольку во втором и третьем предложениях countFruit / 2 используется один и тот же заголовок, вам следует добавить сокращение после теста not(g(H)) во втором предложении. В противном случае вы получите неправильный ответ при возврате.
Кроме того, вместо использования not(g(H)) вы могли бы упростить код, проверив вместо этого g(H) и соответственно переформулировав второе и третье предложение. Но это просто украшение.
Кроме этого, я не вижу очевидной проблемы с вашим кодом. Можете ли вы предоставить фактический запрос, который привел к «false»?.