Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1

Нечетная длина элементов списка

19.03.2015, 22:54. Показов 2962. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что не так,я не пойму?
%1)Определить предикаты "чет" и "нечет" определяющие чётность и нечётность длины списка (предикат "длина" не использовать).

Prolog
1
2
3
%odd_list(spisok).
odd_list([],Temp):-Temp mod 2=0.
odd_list([_|T],Temp):-odd_list(T,Temp1),Temp is Temp1+1.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2015, 22:54
Ответы с готовыми решениями:

Prolog - четная-нечетная длинна списка
Доброго времени суток, помогите решить задание. Определить два предикаты: четная длина (список) и нечетная длина (список) таким образом,...

Если длина списка нечетна, построить список, поменяв местами левую и правую часть списка
Дан список L. Если длина списка нечетна, построить список L1, поменяв местами левую и правую часть списка, в противном случае оставить...

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

4
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
20.03.2015, 01:24
Лучший ответ Сообщение было отмечено DmitryM5 как решение

Решение

Прежде всего, Вы смешиваете два разных подхода к обработке списков.

Стандартный способ: от хвоста к голове. Обработка непустого списка начинается с рекурсивной обработки хвоста, затем голова как-то примешивается к полученному результату. Выход из рекурсии, как правило, на пустом списке, результат для которого задается напрямую, отдельным правилом.

Prolog
1
2
3
4
process([], <некоторая константа>).
process([H|T], R) :-
    process(T, RT),
    R is <некоторые действия с H и RT>.
Способ с накоплением: от головы к хвосту. Требует использования дополнительного параметра для накопления результата. Этот параметр должен быть каким-то образом установлен в начальное значение (например, в обертывающем предикате). На каждом шаге голова списка как-то примешивается к накопленному значению, а затем рекурсивно обрабатывается хвост уже с новым значением накопителя. Выход из рекурсии, как правило, на пустом списке, при этом результат сопоставляется с накопленным значением.

Prolog
1
2
3
4
5
6
7
process_envelop(L, R) :-
    process(L, <некоторая константа>, R).
 
process([], R, R).
process([H|T], R1, R) :-
    R2 is <некоторые действия с H и R1>,
    process(T, R2, R).
Добавлено через 16 минут
Ваш предикат работает с непустыми списками по первой схеме: он вначале вычисляет значение для хвоста, а потом прибавляет к нему единицу. Это значит, что на пустом списке никакого значение еще не будет. На пустом списке только-только должно возникнуть самое первое значение, которое затем, по мере выхода из предикатов будет дополняться обработкой каждой очередной головы.

Вместо этого Вы пытаетесь что-то сделать с этим значением, как будто оно уже существует. Такое возможно только при работе по второй схеме - с накоплением.

Если задаться целью довести до ума Вашу идею, нужно переписать одно из правил по другой схеме. Кроме того, обёртка понадобится в любом случае.

Схема 1:
Prolog
1
2
3
4
5
6
7
8
odd_list_1(L) :-
    odd_list_count(L, N),
    N mod 2 =:= 1.
 
odd_list_count([], 0).
odd_list_count([_|T], N) :-
    odd_list_count(T, NT),
    N is NT+1.
Схема 2:
Prolog
1
2
3
4
5
6
7
8
odd_list_2(L) :-
    odd_list_accum(L, 0, N),
    N mod 2 =:= 1.
 
odd_list_accum([], N, N).
odd_list_accum([_|T], N1, N) :-
    N2 is N1+1,
    odd_list_accum(T, N2, N).
Добавлено через 2 минуты
Но на самом деле нужный предикат можно написать гораздо проще, если отделять сразу по два элемента:
Prolog
1
2
3
odd_list([_]).
odd_list([_, _|T]) :-
    odd_list(T).
Добавлено через 5 минут
Для чётных списков в обеих схемах нужно поставить
Prolog
1
    N mod 2 =:= 0.
А в кратком варианте поменять выход из рекурсии:
Prolog
1
2
3
even_list([]).
even_list([_, _|T]) :-
    even_list(T).
Добавлено через 2 минуты
Примечание.
Схему 2 можно написать в кратком варианте:
Prolog
1
2
3
4
5
6
7
8
odd_list_2(L) :-
    odd_list_accum(L, 0).
 
odd_list_accum([], N) :-
    N mod 2 =:= 1.
odd_list_accum([_|T], N1) :-
    N2 is N1+1,
    odd_list_accum(T, N2).
4
Консультант Витте
 Аватар для DmitryM5
106 / 86 / 45
Регистрация: 27.08.2013
Сообщений: 1,356
Записей в блоге: 1
20.03.2015, 17:55  [ТС]
Спасибо за разъяснения!
0
0 / 0 / 0
Регистрация: 23.09.2018
Сообщений: 1
23.09.2018, 01:02
Ой, спасибо большое! После С++ на Prolog не догоняю.
0
 Аватар для arlat
798 / 601 / 158
Регистрация: 07.10.2013
Сообщений: 1,330
28.09.2018, 18:13
Prolog
1
2
3
4
5
6
7
8
9
10
11
% если пустой список считать четным :)
length_oe([], even).
length_oe([_], odd).
length_oe([_, _ | T], OE) :-
    length_oe(T, OE).
 
% если пустой список нельзя - неудача
length_oe1([_, _], even).
length_oe1([_], odd).
length_oe1([_, _ | T], OE) :-
    length_oe1(T, OE).
Black Fregat уже и так все сказал, это я так
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2018, 18:13
Помогаю со студенческими работами здесь

задан текст. удалить из нее все слова, длина которых четная (создать новый массив, оставив все слова, длина которых нечетная)
задан текст. удалить из нее все слова, длина которых четная (создать новый массив, оставив все слова, длина которых нечетная)

Если длина слова нечётная, то удалить среднюю букву
дано слово. если его длина нечётная, то удалить среднюю букву, в противном случае удалить 2 средних символа. Help очень нада)

Вывести на экран только те элементы массива, длина которых нечетная
Напишите плиз программу! &quot;Задан массив из 7 строк. Вывести на экран только те элементы массива, длина которых нечетная.&quot; ...

Ввести строку символов, если ее длина нечетная, удалить символ, стоящий посередине строки.
Помогите пожалуйста с решением Ввести строку символов, если ее длина нечетная, удалить символ, стоящий посередине строки.

Определить длину введенной строки L, если длина L нечетная, то надо найти середину строк
Определить длину введенной строки L,если длина L нечетная то надо найти середину строк


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru