В этом упражнении на Прологе я пытаюсь вернуть значения из списка, которые больше числа 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
но это не сработало.
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]
Большое спасибо, что заставил меня изучить новую концепцию! я знал только рекурсию.