Проверка всех членов списка - PullRequest
1 голос
/ 13 октября 2019

Допустим, у меня есть следующий список в моем прологе:

L=[10,11,2,3,5]

Есть ли способ, которым мы можем проверить всех членов списка L, чтобы убедиться, что каждый член меньше5

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Здесь предлагается другое решение без использования встроенной функции:

all_less_five([]).
all_less_five([X|L]):-
        X < 5,
        all_less_five(L).

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

Вот некоторые вопросы по предикату:

?- all_less_five([10,11,2]).
false.
?- all_less_five([2,3,6,5]).
false.
?- all_less_five([1,2,3,4]).
true.

Теперь должно быть легко реализовать его для любого данного X. Попробуйте!

0 голосов
/ 13 октября 2019

Мы можем использовать maplist/2 здесь. Это предикат:

maplist(:Goal, ?List)

True, если Goal может быть успешно применен ко всем элементам List. Аргументы переупорядочиваются, чтобы повысить производительность, а также сделать предикат детерминированным при нормальных обстоятельствах.

Таким образом, мы можем здесь проверить элементы с помощью:

all_less_five(L) :-
    maplist(>(5), L).

Здесь для каждого элемента x ∈ L , поэтому он будет вызывать >(5, <i>x</i>) или в виде строки 5 > <i>x</i>. Таким образом, если все эти элементы меньше пяти, предикат all_less_five/1 будет успешным.

Например:

?- all_less_five([10,11,2,3,5]).
false.

?- all_less_five([2,3,5]).
false.

?- all_less_five([2,3]).
true.
...