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

Пролог, пропустить добавление элементов в список на основе правил

У меня есть код Пролога, и я хотел бы иметь возможность пропустить добавление элемента в список результатов, если произведение X и Y больше определенного значения. Есть идеи, как бы я это сделал?

e.g.

if Product > 10

Код, который у меня есть

make_quads(_,[],[]).
make_quads(X,[Y|TAIL],[[X,Y,Sum,Product]|Result]):-
    make_quads(X,TAIL,Result),
    Product is X * Y,
    Product > 2,
    Sum is X + Y.

Функция вызывается следующим образом:

?- make_quads(5, [1,2,3,4,5,6], X).

Это даст следующий результат:

X = [[5, 1, 6, 5], [5, 2, 7, 10], [5, 3, 8, 15], [5, 4, 9, 20], [5, 5, 10, 25], [5, 6, 11|...]]

Я пробовал что-то вроде следующего, но SWI-Prolog возвращает false, как только я вызываю функцию

make_quads(_,[],[]).
make_quads(X,[Y|TAIL],[[X,Y,Sum,Product]|Result]):-
    make_quads(X,TAIL,Result),
    Product is X * Y,
    Product > 20, % I need to skip here
    % Else continue running
    Sum is X + Y.

  • Мне кажется, что в вашем коде отсутствует заголовок вашего второго предложения предиката или есть какая-то опечатка. Вторая строка гласит: make_quads(X,[Y|TAIL],[[X,Y,Sum,Product]| так кажется усеченным? Кроме того, с точки зрения терминологии Пролога, это не функции, а предикаты. 27.02.2016
  • Где в коде вы определяете, какое определенное значение вы не хотите превышать? Или вы планируете передать это в качестве аргумента вашему вызову предиката? 27.02.2016
  • Я обновил описание, в котором излагается то, что я уже пытался. Я знаю, что цель продукта ›20, должна быть оценена как True, чтобы код ниже был достигнут. Но я все еще не уверен, как бы предотвратить добавление продукта и суммы в список результатов, если значение продукта меньше. 27.02.2016

Ответы:


1

Вы уже заметили, что причина того, что ваш предикат терпит неудачу, заключается в том, что он должен быть успешным (а не неудачным), если Product =< 20, но просто не сохранять значения. В его нынешнем виде, как только ваш предикат терпит неудачу на Product > 20, весь предикат терпит неудачу, поскольку в нем отсутствует такое предложение.

Ваше основное предложение необходимо разделить на два случая. Самый простой способ сделать это - добавить еще одно предложение для случая, когда Product =< 20. Кроме того, здесь вы можете использовать хвостовую рекурсию, которая может быть оптимизирована некоторыми интерпретаторами Prolog. Перед установкой значений выполнять рекурсию не нужно:

make_quads(_, [], []).
make_quads(X, [Y|TAIL], [[X,Y,Sum,Product] | Result]):-
    Product is X * Y,
    Product > 20,
    Sum is X + Y,
    make_quads(X, TAIL, Result).
make_quads(X, [Y|TAIL], Result):-
    Product is X * Y,
    Product =< 20,
    make_quads(X, TAIL, Result).

Вы также можете использовать оператор Prolog ->, который немного более эффективен:

make_quads(_, [], []).
make_quads(X, [Y|TAIL], Result):-
    Product is X * Y,
    (   Product > 20
    ->  Sum is X + Y,                   % Do this if Product > 20
        Result = [[X,Y,Sum,Product]|R]
    ;   Result = R                      % Do this if Product =< 20
    ),
    make_quads(X, TAIL, R).
27.02.2016
  • Большое спасибо за терпение и помощь! (Я бы поддержал ваш ответ, если бы у меня была карма). Привет, Джек 27.02.2016
  • @JackEvans рад, что это помогло. Возможно, вы не сможете проголосовать за, но вы можете принять ответ, щелкнув галочку. :) 27.02.2016
  • Новые материалы

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

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

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

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

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

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

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