Пролог Сравнение проблемы - PullRequest
1 голос
/ 16 сентября 2011

кто-нибудь знает, как решить эту проблему

подсчитывает количество появлений оператора внутри выражения.Например, запрос:

?- count(a+b*c-(2+3*4)/(5*(2+a)+(b+c)^f((d-e)*(x-y))), *, C).

будет подсчитывать количество появлений оператора * в выражении, заданном в качестве первого аргумента, и выводить на C

Я использую SWI-пролог

1 Ответ

2 голосов
/ 16 сентября 2011

Это домашнее задание?

Вот несколько советов:

  • Операторы пролога являются синтаксическим сахаром в сравнении с обычными терминами пролога.Выражение 3 * 2 + 1 анализируется как термин '+'('*'(3,2),1).

  • Встроенный предикат =.. разбивает термин в список, главой которого является функтор, ахвост которого содержит [неразложившиеся] термины, которые являются аргументами исходного термина.

  • Встроенный предикат functor/3 объединяет термин с его функтором и арностью.

  • Возможно, вы также захотите взглянуть на arg/3, который предоставляет средства для проверки аргументов указанного термина по порядковой позиции.

Теперьчто вы знаете, что должно появиться довольно простое рекурсивное решение.Если вам нужно учесть арность нужного оператора, он будет немного более запутанным (но не сильно).

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