Я пытаюсь написать предикат, который будет оценивать размер списка, чтобы быть четным или нет, и это нужно сделать, не вычисляя длину списка или любые арифметические операции. Это, наверное, проще, чем вычисление длины, но у меня возникают проблемы с мыслью о том, как это сделать без этого. Я предполагаю какую-то рекурсивную технику, но если кто-то сможет помочь, это будет здорово.Даже размерный список в Prolog
ответ
Я знаю, что это слишком поздно, чтобы ответить на ваш вопрос, но, надеюсь, это поможет:
Чтобы найти список имеет нечетную длину:
oddlength([X]).
oddlength([X,Y,Z]).
oddlength([X,Y|R]) :- oddlength(R),!.
Чтобы найти список имеет четную длину:
evenlength([]).
evenlength([X,Y|R]) :- evenlength(R),!.
Учитывая, что вам нужна только длина нечетного/четного списка, используйте анонимные переменные в качестве заполнителей, за исключением хвоста списка для рекурсивного вызова. –
Я отправил этот ответ, но удалил его, так как это вопрос домашней работы. В общем, не давайте людям делать домашнее задание на все решение. Они будут копировать-вставить. – keyser
@keyser Конечно, я здесь новый, спасибо за совет. –
Да, вы хотите рекурсию. Базовые случаи были бы наименьшими нечетными/четными списками, которые вы можете иметь, и тогда вам нужно всего лишь выяснить, как построить рекурсивный вызов, чтобы он сводился к основному случаю. Вы можете начать с представления списка длины 3, который должен возвращать true для «oddList». Если это не основной случай, каков следующий логический шаг? Как нечетный список отличается от одного?
Preserve logical-purity! Просто действуйте следующим образом:
evenlength([]). % smallest list with even length is [] (length=0)
evenlength([_|Xs]) :-
oddlength(Xs).
oddlength([_|Xs]) :- % smallest list with odd length is [_] (length=1)
evenlength(Xs).
Некоторые простые наземные запросы для evenlength/1
и oddlength/1
:
?- evenlength([]).
true.
?- oddlength([]).
false.
?- evenlength([1]).
false.
?- oddlength([1]).
true.
?- evenlength([1,2]).
true.
?- oddlength([1,2]).
false.
?- evenlength([1,2,3]).
false.
?- oddlength([1,2,3]).
true.
Обратите внимание, что эти предикаты могут не только тестовые списки кандидатов, но и генерировать их:
?- evenlength(Xs).
Xs = []
; Xs = [_A,_B]
; Xs = [_A,_B,_C,_D]
; Xs = [_A,_B,_C,_D,_E,_F]
...
?- oddlength(Xs).
Xs = [_A]
; Xs = [_A,_B,_C]
; Xs = [_A,_B,_C,_D,_E]
; Xs = [_A,_B,_C,_D,_E,_F,_G]
...
Использование meta-predicatefoldl/4
и Prolog lambdas все, что нам нужно сделать, это:
evenlength(Xs) :-
foldl(\_^E^O^(O is \E),Xs,1,1). % each item in `Xs` flips the "evenness flag"
Пример использования:
?- evenlength([]).
true.
?- evenlength([_]).
false.
?- evenlength([_,_]).
true.
?- evenlength([_,_,_]).
false.
?- evenlength([_,_,_,_]).
true.
Давайте не будем забывать и о самом общем запросе!
?- evenlength(Xs).
Xs = []
; Xs = [_A,_B]
; Xs = [_A,_B,_C,_D]
; Xs = [_A,_B,_C,_D,_E,_F]
...
- 1. Отфильтровать список в Prolog
- 2. Сгладить список в Prolog
- 3. Список предикатов в Prolog
- 4. Итерационный список в Prolog
- 5. Список списков в Prolog
- 6. Prolog Список Вопрос
- 7. prolog- разорвать список
- 8. Prolog - Рекурсивный список
- 9. Prolog Список SWI создание
- 10. Unifying список списков Prolog
- 11. Prolog Программирование Список Арифметика
- 12. Как заменить список в Prolog?
- 13. PROLOG: сохранить список в рекурсии
- 14. Как создать список в Prolog?
- 15. Prolog: сортировать список в списке
- 16. Prolog - добавление в список рекурсивно
- 17. Разделить список динамически в Prolog
- 18. Как разбить список в Prolog?
- 19. Prolog добавить переменную в список
- 20. Симметричный 2 размерный массив
- 21. Правильный размерный вид в -loadView
- 22. Prolog: Список рекурсии и модификации
- 23. Prolog Как объявить список переменной
- 24. Prolog - Изменить и вернуть список
- 25. Prolog beginner - список обратного вывода
- 26. Список и реестр SWI-Prolog
- 27. Prolog: заполнить список n элементами
- 28. Объединить выходы в один список в Prolog
- 29. Как преобразовать термин в список в Prolog
- 30. Преобразование из строки в список в Prolog
Вас интересуют списки ровной длины. – false