Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
7 / 7 / 2
Регистрация: 17.10.2009
Сообщений: 325

как находится максимальный элемент в списке.

07.06.2012, 19:32. Показов 2663. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла проблема, не могу понять как находится максимальный элемент в списке. То что на трёх языках написал бы не задумываясь, на прологе уже готовая программа заставляет задуматься. Вот код:
Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
domains
    element = integer
    list = element*
    
predicates
    buy(string, integer)
    max_price(list, integer)
    list(list)
    max(integer, integer, integer)             
    
clauses
    buy("Автомобиль", 35).
    buy("Вертолёт", 2500).
    buy("Микроволновая печь", 5).
    list(List) :- 
                      findall(X, buy(_, X), List).
        
    max_price([Max1], Max1).
    max_price([H|T], Max1) :- 
                              max_price(T, M),
                              max(H, M, Max1).
    
    max(X, Y, Max) :- X <= Y,
                      Max = Y.
    max(X, Y, Max) :- X >= Y,
                      Max = X.
 
goal
        list(L), max_price(L, M), buy(Buy, M).
Сначала, напишу, то что понятно:
Первый факт предиката max_price насколько я понимаю означает следующее: если в списке один элемент, то его значение присваивается переменной Max1.
Второе правило предиката max_price отсекает голову от списка и в качестве второй переменной подаётся Max1. Предикат max_price вызывается рекурсивно с хвостом списка и переменной M, до тех пор пока не останется один элемент. Когда остался один элемент, срабатывает первое правило предиката, прерывая рекурсию, и в переменной M оказывается значение Max1 = 5. Когда рекурсия остановлена, предикат max должен сработать со всеми элементами в стеке, значение M уже есть, значение H = 2500, последняя отсечённая голова. В Max1 оказывается после вычисления в правиле max - 2500.
Теперь непонятки, во первых стек: если пройтись дебагером, оказывается, что стек следующий:
1) max_price([5], _)
2) max_price([2500, 5], _)
3) max_price([35, 2500, 5], _)
Если стек такой, откуда берётся H? Я думал отсечённые головы заносятся в стек. Как в переменной M оказывается значение 2500?. Насколько я понимаю 2500 должно было занестись в Max1. Надеюсь я понятно изложился? На каком моменте в моём объяснении начался бред если он есть, и как правильно это понимать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2012, 19:32
Ответы с готовыми решениями:

Максимальный элемент в списке
implement fn open core constants className = &quot;formcontainer/fn&quot;. classVersion = &quot;&quot;. domains ...

Определите максимальный элемент в списке.
ПОМОГИТЕ ПОЖАЛУЙСТА,ПРОГРАММА НЕ ИДЕТ... DOMAINS list=integer* PREDICATES nondeterm max(list,integer) CLAUSES max(,0). ...

Поменять в списке максимальный и минимальный элемент местами
1. Простая программа: поменять в списке максимальный и минимальный элемент местами. Для начала я их определила: max():- max1(Y,X,M). ...

6
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
07.06.2012, 21:55
Какое-то путанное объяснение)
Незачем в эти стэки влазить, логику поймите
Prolog
1
2
3
4
max_price([Max1], Max1). %Если в списке всего 1 элемент, то это и есть максимум
max_price([H|T], Max1) :-%Иначе
     max_price(T, M),%находим М - максимум в хвосте 
     max(H, M, Max1).%и надо выбрать наибольшее из двух значений М и Н
1
7 / 7 / 2
Регистрация: 17.10.2009
Сообщений: 325
07.06.2012, 22:13  [ТС]
хорошо, есть список: [3, 5, 60 ,34, 20]. Какое первое значение примет M, какое второе и т. д. и почему?
По идее первое значение будет 20, так как этот элемент останется последним и единственным в списке, H будет - 34. Максимальное значение из этих двух 34. А дальше как и почему?
0
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
07.06.2012, 22:18
Потом будет
H=60, M=34 -> Max1=60
H=5, M=60 -> Max1=60
H=3, M=60 -> Max1=60
0
7 / 7 / 2
Регистрация: 17.10.2009
Сообщений: 325
08.06.2012, 06:28  [ТС]
наверное я сильно туплю, но не могу понять как 34 попало в M?

Добавлено через 7 часов 58 минут
Грымзик, вы можете, мне объяснить, как в M попадает максимальное выбранное в max из двух H, M значение, оно же записывается в Max1?
0
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
08.06.2012, 13:14
Не могу, я не мастер на объяснения, а тем более когда Вы просто чего основного не понимаете. Максимум из двух записывается в Max1, но предикат его и возвращает, ведь max_price([H|T], Max1), и поэтому при вызове max_price(T, M) М примет значение, которое когда-то имела Max1.
0
7 / 7 / 2
Регистрация: 17.10.2009
Сообщений: 325
08.06.2012, 18:01  [ТС]
Я так и подумал примерно, но не был уверен, так как не мог это последовательно проверить, там всё очень непривычно буду еще писать на пролог и привыкну, спасибо большое за объяснение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2012, 18:01
Помогаю со студенческими работами здесь

Найти, сколько раз в списке встречается максимальный элемент
Помогите закончить программу, нужно найти сколько раз встречается максимальный элемент,и вот с count_member не понимаю! DOMAINS ...

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

Определить на каком уровне в дереве находится его максимальный элемент
Ребята, помогите, пожалуйста с программой.. я с прологом в &quot;плохих отношениях&quot;.... очень нужна ваша помощь.... Нужно определить на каком...

Найти максимальный элемент списка который находится в другом списке
У меня есть список &quot;Созвездия&quot;. В этом списке есть 2 поля: Имя созвездия и еще один список &quot;звезд&quot;. В списке &quot;звезд&quot;...

Поменять местами строку , в которой находится максимальный элемент со строкой, где находится минимальный элемент матрицы
Дана целочисленная матрица А размером N, где N вводится с клавиатуры. Поменять местами строку , в которой находится максимальный элемент со...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru