Nano Hash - криптовалюты, майнинг, программирование

Элементы списка Prolog count выше n

Я новичок в Prolog, поэтому у меня есть несколько проблем с определенной задачей. Задача состоит в том, чтобы написать хвостовой рекурсивный предикат count_elems(List,N,Count) условие List_Element > N, Count1 is Count+1.

Мой подход:

count_elems( L, N, Count ) :-
   count_elems(L,N,0).
count_elems( [H|T], N, Count ) :-
   H > N ,
   Count1 is Count+1 ,
   count_elems(T,N,Count1).
count_elems( [H|T], N, Count ) :-
   count_elems(T,N,Count).

Сообщение об ошибке:

ERROR: toplevel: Undefined procedure: count_elems/3 (DWIM could not correct goal)

Я не совсем уверен, где проблема. спасибо за любую помощь :)

02.12.2013

Ответы:


1

Если вы хотите сделать хвостовую рекурсивную версию своего кода, вам нужен (как указывает CapelliC) дополнительный параметр, который будет действовать как аккумулятор. Вы можете увидеть проблему в своем первом предложении:

count_elems(L, N, Count) :- count_elems(L,N,0).

Здесь Count — одноэлементная переменная, нигде не созданная. Ваш рекурсивный вызов count_elems начинает отсчет с 0, но больше нет переменной для создания экземпляра с суммой. Итак, вам нужно:

count_elems(L, N, Count) :-
    count_elems(L, N, 0, Count).

Затем объявите пункты count_elem/4:

count_elems([H|T], N, Acc, Count) :-
    H > N,                            % count this element if it's > N
    Acc1 is Acc + 1,                  % increment the accumulator
    count_elems(T, N, Acc1, Count).   % check the rest of the list
count_elems([H|T], N, Acc, Count) :-
    H =< N,                           % don't count this element if it's <= N
    count_elems(T, N, Acc, Count).    % check rest of list (w/out incrementing acc)
count_elems([], _, Count, Count).     % At the end, instantiate total with accumulator

Вы также можете использовать структуру if-else для count_elems/4:

count_elems([H|T], N, Acc, Count) :-
    (H > N
    ->  Acc1 is Acc + 1
    ;   Acc1 = Acc
    ),
    count_elems(T, N, Acc1, Count).
count_elems([], _, Count, Count).

Кроме того, как указал CapelliC, ваше заявленное сообщение об ошибке, вероятно, связано с тем, что вы не читаете исходный файл пролога.

02.12.2013

2

Сохранить logical-purity с помощью clpfd!

Вот как:

:- use_module(library(clpfd)).

count_elems([],_,0).
count_elems([X|Xs],Z,Count) :-
   X #=< Z,
   count_elems(Xs,Z,Count).
count_elems([X|Xs],Z,Count) :-
   X #> Z,
   Count #= Count0 + 1,
   count_elems(Xs,Z,Count0).

Давайте посмотрим, насколько универсален count_elems/3:

?- count_elems([1,2,3,4,5,4,3,2],2,Count).
Count = 5 ;                                   % leaves useless choicepoint behind
false.

?- count_elems([1,2,3,4,5,4,3,2],X,3).
X = 3 ;
false.

?- count_elems([1,2,3,4,5,4,3,2],X,Count).
Count = 0, X in 5..sup ;
Count = 1, X = 4       ;
Count = 3, X = Count   ;
Count = 5, X = 2       ;
Count = 7, X = 1       ;
Count = 8, X in inf..0 .

Редактировать 2015-05-05

Мы также могли бы использовать метапредикат tcount/3 в сочетании с овеществленной версией (#<)/2:

#<(X,Y,Truth) :- integer(X), integer(Y), !, ( X<Y -> Truth=true ; Truth=false ).
#<(X,Y,true)  :- X #<  Y.
#<(X,Y,false) :- X #>= Y.

Давайте снова запустим вышеуказанные запросы!

?- tcount(#<(2),[1,2,3,4,5,4,3,2],Count).
Count = 5.                                           % succeeds deterministically

?- tcount(#<(X),[1,2,3,4,5,4,3,2],3).
X = 3 ;
false.

?- tcount(#<(X),[1,2,3,4,5,4,3,2],Count).
Count = 8, X in inf..0 ;
Count = 7, X = 1       ;
Count = 5, X = 2       ;
Count = 3, X = Count   ;
Count = 1, X = 4       ; 
Count = 0, X in 5..sup .

Примечание относительно эффективности:

  • count_elems([1,2,3,4,5,4,3,2],2,Count) оставил бесполезную точку выбора.
  • tcount(#<(2),[1,2,3,4,5,4,3,2],Count) удалось детерминистически.
04.05.2015
  • Почему не версия более высокого порядка? 04.05.2015
  • Вы не знаете! (=)/3 касается синтаксического равенства, но вам нужно равенство по модулю CLPFD 04.05.2015
  • Итак, определите (#=<)/3 аналогично (=)/2. 04.05.2015

  • 3

    Кажется, вы не сверились с исходным файлом.

    Когда вы это исправите (вы можете сохранить эти правила в файле count_elems.pl, а затем выдать ?- consult(count_elems).), вы столкнетесь с фактической проблемой, что Count это одноэлементное правило в первом правиле, указывающее, что вы должны передать счетчик вниз фактическому хвостовые рекурсивные предложения и объединить его с аккумулятором (счетчик, который обновляется до Count1), когда посещение списка выполнено.

    Вы закончите с 3 предложениями count_elems/4. Не забывайте базовый случай:

    count_elems([],_,C,C).
    
    02.12.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..