Получить список положительных значений в Прологе - PullRequest
0 голосов
/ 26 февраля 2019

Итак, я пытаюсь получить список положительных элементов из данного списка.Пока что я пришел к этому решению:

1 getPos([],[]).
2 getPos([], L).
3 getPos([Head|Tail], L):-
4   Head<0, getPos(Tail,L).
5 getPos([Head|Tail], L:-
6   Head>0, getPos(Tail, [Head|L]).

Если я попытаюсь getPos([1,-2,3], Result)., я получу факт № 2 с таким результатом:

Call: getPos([], [3,1|_29])?
Exit: getPos([], [3,1|_29])?

После этого я просто ухожурекурсии и в конечном итоге только «да» ответ.Мои 2 вопроса:
1. Что мне делать, чтобы моя программа остановилась на этом 2-м факте и просто вернула значение L
2. Можно ли сохранить порядок списка источников?(моя версия переворачивает список источников)

1 Ответ

0 голосов
/ 26 февраля 2019

Вы должны использовать третий аргумент getPos (In, CurOut, Out) , а когда In пусто (например, [], вы объединяете CurOut с Out., Так что вы получаете

getPos(In, Out) :-
    getPos(In, [], Out).
getPos([],L, L).
% getPos_1([], L).
getPos([Head|Tail], CurL, L):-
   Head<0, getPos(Tail,CurL, L).
getPos([Head|Tail], CurL, L):-
   Head>0, getPos(Tail, [Head|CurL], L).

Что вы делаете, если значение равно 0?

В SWI-Prolog вы можете использовать include/3

get_pos(In, Out) :-
    include(>( 0), In, Out).

Если вы хотите использовать только 2 аргумента, вы можете написать

getPos1([], []).
getPos1([Head|Tail], L):-
   Head<0, getPos1(Tail,L).
getPos1([Head|Tail], [Head|L]):-
   Head>0, 
   getPos1(Tail, L).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...