Пролог: Фильтрация списка?

измените свою кнопку на:

<button id="submit" type="button" onclick="calculeaza()" style="margin- top: 5%; "> CALCULEAZA

по умолчанию кнопка имеет тип SUBMIT, которая отправит форму. Вы можете использовать JavaScript, чтобы отключить функцию или просто внести небольшие изменения в вашу кнопку.

16
задан false 5 February 2015 в 13:49
поделиться

3 ответа

При поиске функций высшего порядка в Прологе необходимо определенно консультироваться с Naish (1995), очень хороший ресурс на этом.

Его определение filter/3 следующее (он использует нотацию списка различия, поэтому выходит из необходимости определить filter/4):


filter(_,[],[]).
filter(P, A0-As0, As) :-
    (
        call(P, A0) -> As = A0-As1
    ;
        As = As1
    )
    , filter(P, As0, As1).

Я у Вас есть вопросы об этом предикате, спрашивают меня в комментарии. Читать газету также настоятельно рекомендовано, это также определяет map, foldr и compose! Примечание, которое многие ограничения он упоминает (как, например, отсутствие call/3 или высшего порядка apply не подавайте заявку больше. SWI-пролог имеет =.. оператор, который обращается ко всем его проблемам и делает произвольную логику n-порядка возможной.

11
ответ дан 30 November 2019 в 21:46
поделиться

Предложения SWI-пролога exclude/3 и другие такие метапредикаты. Ваша исходная проблема может быть кодирована как это:

are_identical(X, Y) :-
    X == Y.

filterList(A, In, Out) :-
    exclude(are_identical(A), In, Out).

Пример использования:

?- filterList(A, [A, B, A, C, D, A], Out).
Out = [B, C, D].
10
ответ дан 30 November 2019 в 21:46
поделиться

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

filterList(_,[],R,R).           % Returns answer when the list is exhausted.
filterList(L,[A|List],Temp,Res) :-
   filterList(L,List,New,Res),  % Recursive call, New is either the same list
   (  filter(L,A),              % in case the filter outputs true, or the list
      New = Temp
   ;  New = [A|Temp]            % plus the current element otherwise.
   ).
0
ответ дан 30 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: