Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Mercury]не могу понять смысла кода 
:(
    Опции темы
chaos
Дата 22.9.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



решил расширить себе сознание smile
пытаюсь вникать в Mercury

Есть такой код:
Код

:- module test.
:- interface.
:- import_module io.

:- pred main(io::di, io::uo) is cc_multi.

:- implementation.
:- import_module list, int, string.

:- pred pick(list(int)::in, int::out, list(int)::out) is nondet.
pick([Head | Rest], Head, Rest).
pick([Head | Rest], Head2, [Head | Rest2]) :- pick(Rest, Head2, Rest2).

main(!IO) :-
        (if
                N = [1,2,3,4,5,6,7,8,9],
                pick(N, A, N1),
                pick(N1, B, N2),
                12 = A + B
        then
                io.format("%d + %d = %d\n", [i(A), i(B), i(A+B)], !IO),
                io.nl(!IO)
        else
                io.write_string("has no solutuins\n", !IO)
        ).


который подбирает такие А и B что бы выполнялось условие A+B=12. Решений много, возвращается одно 3 + 9
Не могу понять эти строчки
Код

pick([Head | Rest], Head, Rest).
pick([Head | Rest], Head2, [Head | Rest2]) :- pick(Rest, Head2, Rest2).


как они работают? почему используется 2ой предикат?
Сможет кто-нить объяснить "на пальцах"?! smile
PM WWW   Вверх
Грымзик
Дата 22.9.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 7.10.2009

Репутация: 6
Всего: 6



Это не 2й предикат, а 2е правило предиката. Предикат pick достает из входящего
списка произвольный элемент и возвращает его и оставшуюся часть списка.
pick([Head | Rest], Head, Rest). Можно извлечь первый элемент, а оставшейся частью будет "хвост" списка.
pick([Head | Rest], Head2, [Head | Rest2]) :- pick(Rest, Head2, Rest2). А можно первый элемент оставить
на месте, а рекусивно достать элемент их "хвоста", ну и соответственно и оставшуюся часть "хвоста" вернуть.
PM MAIL   Вверх
chaos
Дата 22.9.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



Цитата(Грымзик @  22.9.2011,  15:54 Найти цитируемый пост)
Это не 2й предикат, а 2е правило предиката.

отличное замечание! smile 

Цитата(Грымзик @  22.9.2011,  15:54 Найти цитируемый пост)
Предикат pick достает из входящего
списка произвольный элемент и возвращает его и оставшуюся часть списка.

радует что это я понял

Цитата(Грымзик @  22.9.2011,  15:54 Найти цитируемый пост)
pick([Head | Rest], Head, Rest). Можно извлечь первый элемент, а оставшейся частью будет "хвост" списка.

и это понятно

Цитата(Грымзик @  22.9.2011,  15:54 Найти цитируемый пост)
pick([Head | Rest], Head2, [Head | Rest2]) :- pick(Rest, Head2, Rest2). А можно первый элемент оставить
на месте, а рекусивно достать элемент их "хвоста", ну и соответственно и оставшуюся часть "хвоста" вернуть. 

и это тоже

пока не получается уложить в голове - как эти правила связываются? почему например Mercury "обращает внимание" на второе правило?
вообщем пока не могу осилить :(
PM WWW   Вверх
chaos
Дата 22.9.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



покую еще Сошникова
PM WWW   Вверх
chaos
Дата 22.9.2011, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



Грымзик, дошло до меня smile
Код

pick([Head | Rest], Head, Rest).
pick([Head | Rest], Head2, [Head | Rest2]) :- pick(Rest, Head2, Rest2).

это всего лишь
Код

:- pred pick(int, list(int)).
:- mode pick(out, in) is nondet.

pick(N, [N|_]).
pick(N, [_|Rest]) :- pick(N, Rest).

те это рекурсивный обход списка

ЗЫ как же сложно после 10 лет императивного быдлокодинга вникать в подобные вещи smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.1739 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.