Пролог подсчитывает элементы в списке

#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»?.