Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2015, 00:50   #1
INIFREY
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 23
Печаль Арифметические операции - Prolog

Помогите написать программу в прологе. Желательно Turbo Prolog.

Необходимо найти «срединный» элемент списка нечетной длины..


Вот пример для вычисления суммы четных элементов числового списка:
Код:
/* Ливорекурсивна процедура расчета суммы четных элементов списка sum (+ Cписок, -Cyммa)               */
t([Hl],0).             % граничное условие для списка нечетной длины
t([Hl,H2],H2).  % граничное условие для списка четной длины
t([Hl,H2[T],Sum):-
                       t(T,Int_sum),
Sum is Int_sum+H2.

Запросы
t([l,2,3,4,5],S).

S = 6 ->

yes
t([l,2,3,4,5,6],S).

S = 12 ->

yes
INIFREY вне форума Ответить с цитированием
Старый 10.11.2015, 08:38   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Берешь предикаты length и nth0 (в других видах пролога они встроенные, а в Turbo их надо дописать) и реализуешь очень просто:
Код:
middle_element(List, Element):-
  length(List, Length),
  HalfLength = Length / 2,
  MiddlePos = round(HalfLength),
  Length = MiddlePos * 2, % проверка нечетности (заодно)
  nth0(List, MiddlePos).
Примерно так.
rrrFer вне форума Ответить с цитированием
Старый 10.11.2015, 22:46   #3
INIFREY
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 23
По умолчанию

Спасибо! А можно еще пример запроса? Не очень пока разобрался в прологе, пробовал middle_element([1,2,3],Element). и не работает

(делал в ARITY PROLOG )
INIFREY вне форума Ответить с цитированием
Старый 11.11.2015, 09:16   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Как именно "не работает"? Ошибки выдает какие-то или еще что-то?
rrrFer вне форума Ответить с цитированием
Старый 11.11.2015, 10:29   #5
INIFREY
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 23
По умолчанию

Выдает всегда no
Скорее всего сам запрос не правильный
INIFREY вне форума Ответить с цитированием
Старый 11.11.2015, 15:53   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

INIFREY
код программы (для турпролога, вы ведь в нем запускаете?) целиком скиньте
rrrFer вне форума Ответить с цитированием
Старый 11.11.2015, 16:15   #7
INIFREY
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 23
По умолчанию

Запускал в ARITY PROLOG.
Код использовал:
Код:
middle_element(List, Element):-
  length(List, Length),
  HalfLength = Length / 2,
  MiddlePos = round(HalfLength),
  Length = MiddlePos * 2, % проверка нечетности (заодно)
  nth0(List, MiddlePos).
И запрос middle_element([1,2,3],Element).




Последний раз редактировалось INIFREY; 11.11.2015 в 16:23.
INIFREY вне форума Ответить с цитированием
Старый 11.11.2015, 18:30   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

убери строку
Код:
Length = MiddlePos * 2
Тут поидее должно быть что-то типа
Код:
Length \= MiddlePos * 2
И я не уверен что в Arity есть функция round.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметические операции nikita-92 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 11.04.2013 00:08
Арифметические операции. Saintpatrick38 Помощь студентам 2 05.04.2013 09:04
Арифметические операции swillrocker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.10.2012 21:31
Арифметические операции Ассемблер BAV Помощь студентам 9 05.03.2008 00:21