Пролог подсчитывает элементы в списке - PullRequest
0 голосов
/ 25 октября 2011

Я хочу посчитать, сколько 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).

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Вызывая ?- countFruit(H,0)., вы говорите прологу унифицировать переменную No в вашем предикате countfruit\2 до 0.Таким образом, результат может быть только 0 или 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.
0 голосов
/ 25 октября 2011

Ваш код содержит одну ошибку: поскольку второе и третье предложение countFruit / 2 использует одну и ту же головку, вы должны добавить разрез после теста not (g (H)) во втором предложении.В противном случае вы получите неправильный ответ при возврате.

Кроме того, вместо использования not (g (H)), вы могли бы упростить код, проверив вместо этого g (H) и переформулировав второе и третье предложение соответственно.Но это просто замечательно.

Кроме этого, я не вижу очевидной проблемы с вашим кодом.Можете ли вы указать фактический запрос, который привел к значению 'false'?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...