Количество элементов больше 2 в списке - PullRequest
0 голосов
/ 09 мая 2018

У меня есть список с номерами.(например: L = [1,0,0,1,3,2,3] ).

Я пытаюсь создать предикат, который принимает этот список и возвращает целое числоE, который является временем появления любого числа больше 2.

Например, в приведенном выше случае предположим, что предикат называется pred / 2 , затем pred ([1,0,0,1,3,2,3], E) вернет E = 2 , потому что единственное число больше 2 - 3, и это число встречается 2 раза.

В случае, если есть 2 и более различных числа, больших 2, например: L = [0,1,1,2,3,4,5,6,6] будетдолжны вернуть 5, потому что есть 5 чисел, которые больше, чем 2.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Я понял, что лучший способ - написать современный пролог с использованием предикатов высокого порядка:

pred(List, Count) :-
    maplist([In,Out] >> (In>2 -> Out=1 ; Out=0), List, BinaryList),
    foldl([In1,In2,Out] >> (Out is In1+In2), BinaryList, 0, Count).

, который работает, отображая каждый элемент в 1, если он больше 2, в противном случае в 0, а затем суммируя 1 и 0.

Некоторые тесты:

?- pred([1,0,0,1,3,2,3], Count).
Count = 2.

?- pred([0,1,1,2,3,4,5,6,6], Count).
Count = 5.

Бонус: это можно обобщить, чтобы подсчитать, сколько элементов удерживает предикат:

count(Pred, List, Count) :-
    maplist([In,Out] >> (call(Pred,In) -> Out=1 ; Out=0), List, BinaryList),
    foldl([In1,In2,Out] >> (Out is In1+In2), BinaryList, 0, Count).

чтобы мы могли передать (X>2) в качестве аргумента:

?- count([X] >> (X>2), [1,0,0,1,3,2,3], Count).
Count = 2.

или что-то еще:

?- count([X] >> (X<2), [1,0,0,1,3,2,3], Count).
Count = 4.
0 голосов
/ 10 мая 2018

Мы можем использовать предикат помощника с аккумулятором count / 3 . Мы будем использовать этот накопитель для хранения уже найденных значений больше 2.

% we initialize accumulator with 0
count(L, Count) :- count2(L, 0, Count).

% for empty list there is no more elements grater than 2
count2([], Acum, Acum).

% otherwise we have two consider two cases
count2([H|T], Acum, Out) :-
( H > 2 ->
    Acum2 is Acum + 1,
    count2(T, Acum2, Out)
;
    count2(T, Acum, Out)
).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...