Возврат нескольких значений из списка Prolog

В этом упражнении на Прологе я пытаюсь вернуть значения из списка, которые больше числа N.

Например: greater_than([5,6,1,7], 5, X) должен вернуть X = 6 ; X = 7.

Я попытался решить это, выполнив:

greater_than([],_,_).   % to stop recursion when list is empty
greater_than([H|T],N,X) :-
   H > N,
   X is H,
   greater_than(T,N,M). % if H>N return X=H
greater_than([H|T],N,X) :-
   H =< N,
   greater_than(T,N,X). % if H=<N just continue recursion.

Мой код работает, когда есть только один результат: greater_than([1,2,5], 2, X) возвращает X = 5.

Но это не работает с несколькими результатами: greater_than([1,2,5,7], 2, X) возвращает false.

Из этого я понял, что X уже привязан к числу и (X is H) во второй раз возвращает false.

Но я не знал, как получить несколько результатов.

Я попытался изменить имя переменной:

greater_than([H|T],N,X) :-
   H > N,
   X is H,
   greater_than(T,N,X1).   % X1 for example

но это не сработало.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I understood from this that X is already binded to a number and (X is H) for the second time returns false.

Почти, но не совсем, потому что это происходит в разных вызовах, так что это может работать само по себе. Ваш код связывает X=5, а затем при следующем вызове он связывает M=7, и вам негде увидеть значение M. 7 уже используется, когда вы снова ищете, ответов больше нет, потому что он нашел все ответы, дошел до конца списка.

Вы смешиваете откат с рекурсией, два разных способа решения этой проблемы.

Решение для возврата:

greater_than(List, Cutoff, X) :-
   member(X, List),
   X > Cutoff.

Затем:

?- greater_than([1,2,5,7], 2, X).
X = 5 ;
X = 7

Он находит один ответ и ждет, затем вы просите еще, и он находит еще.

Рекурсивное решение проходит по списку в вашем коде вместо того, чтобы это делал Prolog, например. чтобы построить список со всеми ответами:

greater_than([], _, []).  % recursion base case. Empty list input, empty list output.
greater_than([H|T], Cutoff, [H|Result_T]) :-
    H > Cutoff,
    greater_than(T, Cutoff, Result_T).
greater_than([H|T], Cutoff, Result) :-
    H =< Cutoff,
    greater_than(T, Cutoff, Result).

Затем:

?- greater_than([1,2,5], 2, X).
X = [5]

Большое спасибо, что заставил меня изучить новую концепцию! я знал только рекурсию.

Hami Dou 01.04.2022 00:41

Другие вопросы по теме