Схема ИЛИ | Техника и Программы
Логической схемой ИЛИ называется схема с одним выходом и любым числом входов, когда выходной сигнал образуется в результате .воздействия входного сигнала иа один или несколько входов схемы. На рис. 8.2, а показана типичная схема (вентиль) ИЛИ, выполненная на диодах. На схеме изображены три входа, хотя можно использовать только два входа или же добавить другие входы. Такой вентиль ИЛИ не нуждается в источнике питания, поскольку для обеспечения проводимости диодов подаются входные сигналы соответствующей полярности.
Когда к входу A прикладывается положительное (по отношению к земле) напряжение или импульс, диод Д] становится проводящим. Возникающий при этом ток создает на резисторе падение напряжения, представляющее выходной сигнал. Таким образом, при подаче импульса на вход А возникает выходной-импульс. Такой же результат получается при подаче импульса на вход В или С. Если импульсы напряжения; одинаковой высоты приложены к двум или трем входам одновременно, выходной сигнал практически не отличается от рассмотренного. Таким образом, один и тот же выходной сигнал образуется при воздействии сигнала на вход Л, ИЛИ на вход
Рис. 8.2. Схемы ИЛИ и их условные обозначения.
На рис. 8.2,6 показана схема ИЛИ, реализованная на транзисторах, включенных с объединенным эмиттером. Для увеличения числа входов можно использовать три или более транзистора. На оба коллектора подается положительное напряжение, создающее обратное смещение коллекторных переходов. При отсутствии входных сигналов транзисторы практически заперты и выходной сигнал отсутствует. Однако, когда к входу А прикладывается импульс положительной полярности, транзистор Т1 отпирается. Возникает ток эмиттера, который протекает через резистор в цепи эмиттера и создает на этом резисторе падение напряжения, являющееся выходным сигналом. Аналогично импульс положительной полярности на входе В также приводит к появлению выходного сигнала, поскольку в этом случае отпирается транзистор Т2. Как и в случае схемы, показанной на рис. 8.2, а, при одновременном воздействии сигналов на оба входа также возникает выходной сигнал, что соответствует логической функции ИЛИ.
На рис. 8.2,в — д показаны условные обозначения схемы ИЛИ с различным числом входов (2, 3 и 5) [В отечественной научно-технической литературе используются другие обозначения схемы ИЛИ. —
Как отмечалось выше, логическим состояниям ИСТИНА (И) и ЛОЖЬ (Л) соответствуют два значения логической величины. Логическая сумма двух логических величин может принимать значения, указанные в табл. 8.1 — 8.3.
Таблица 8.1
0 + 0 = 0
A + 0 = 1
0 + B = 1
A + B = 1
Таблица 8.2
Л + Л = Л
И + Л = И
Л + И = Л
И + И = И
Таблица 8.3
0 + 0 = 0
1 + 0 = 1
0 + 1 =1
1 + 1 = 1
При большем числе логических слагаемых возможны соотношения:
0+0 + 0 = 0; 0 + 1+0=1 и т. д.
Схемная реализация логических элементов И-ИЛИ-НЕ и других
Для выполнения логических операций и решать логические задачи с помощью средств электроники были изобретены логические элементы. Их создают с помощью диодов, транзисторов и комбинированных элементов (диодно-транзисторные). Такая логика получила название диодной логики (ДЛ), транзисторной (ТЛ) и диодно–транзисторной (ДТЛ). Используют как полевые, так и биполярные транзисторы. В последнем случае предпочтение отдается устройствам типа n-p-n, так как они обладают большим быстродействием.
Логический элемент «ИЛИ»
Схема логического элемента «ИЛИ» представлена на рисунке 1 а. На каждый из входов может подаваться сигнал в виде какого-то напряжения (единица) или его отсутствия (ноль). На резисторе R появиться напряжение даже при его появлении на каком – либо из диодов.
Рис. 1Элементы или могут иметь несколько логических входов. Если используются не все входы, то те входы которые не используются следует соединять с землей (заземлять), чтобы избежать появления посторонних сигналов.
На рисунке 1б показано обозначение на электрической схеме элемента, а на 1в таблица истинности.
Логический элемент «И»
Схема элемента приведена на рис. 2. Если хотя – бы к одному из входов будет сигнал равный нулю, то через диод будет протекать ток. Падение напряжения на диоде стремится к нулю, соответственно на выходе тоже будет ноль. На выходе сможет появится сигнал только при условии, что все диоды будут закрыты, то есть на всех входах будет сигнал. Рассчитаем уровень сигнала на выходе устройства:
Рис.2на рис. 2 б – обозначение на схеме, в – таблица истинности.
Логический элемент «НЕ»
В логическом элементе «НЕ» используют транзистор (рис.3 а). при наличии положительного напряжения на входе х=1 транзистор открывается и напряжение его коллектора стремится к нулю. Если х=0 то положительного сигнала на базе нет, транзистор закрыт, ток не проходит через коллектор и на резисторе R нет падения напряжения, соответственно на коллекторе появится сигнал Е. условное обозначение и таблица истинности приведены на рис. 3 б,в.
Рис.3Логический элемент «ИЛИ-НЕ»
При создании различных схем на логических элементах часто применяют элементы комбинированные. В таких элементах совмещены несколько функций. Принципиальная схема показана на рис. 4 а.
Рис.4Здесь диоды Д1 и Д2 выполняют роль элемента «ИЛИ», а транзистор играет роль инвертора. Обозначение элемента на схеме и его таблица истинности рис. 4б и в соответственно.
Логический элемент «И-НЕ»
Показана схема на рис. 5 а. Здесь диод Д3 выполняет роль так сказать фильтра во избежание искажения сигнала. Если на вход х1 или х2 не подан сигнал (х1=0 или х2=0), то через диод Д1 или Д2 будет протекать ток. Падение на нем не равно нулю и может оказаться достаточным для открытия транзистора. Последствием чего может стать ложное срабатывание и на выходе вместо единицы мы получим ноль. А если в цепь включить Д3, то на нем упадет значительная часть напряжения открытого на входе диода, и на базу транзистора практически ничего не приходит. Поэтому он будет закрыт, а на выходе будет единица, что и требуется при наличии нуля на каком либо из входов. На рис. 5б и в показаны таблица истинности и схемное обозначение данного устройства.
Рис.5Логические элементы получили широчайшее применение в электронике и микропроцессорной технике. Многие системы управления строятся с использованием именно этих устройств.
Цифровые логические схемы и системы
Цифровое управление — сравнительно новая область в электронике. Оно ведет свое происхождение от теории связи. Цифровое управление охватывает компьютерную технику, электронные АТС, промышленные системы управления, системы обработки данных и множество других подобных систем. Цифровые приборы работают в дискретном режиме, обычно ON (включено) или OFF (выключено). Главной и неотъемлемой особенностью цифрового прибора является переход из одного состояния в другое без «остановки» в каком-либо промежуточном положении.
Логические схемы
Логические элементы, или схемы, – это цифровые приборы, которые имеют на выходе одно из двух состояний: нулевой выход (обозначается 0) и фиксированный выход (обозначается 1). Логическая схема может иметь несколько входов и только один выход.
Логическая схема И (рис. 11.1)
Схема И выдает на выходе логическую 1, когда на все ее входы подан сигнал, соответствующий логической 1. На рис. 11.1 показана схема И с двумя входами. Ее выход равен 1 только в том случае, если и на вход А, и на вход В подана 1. В табл. 11.1 функция И представлена в виде так называемой таблицы истинности.
На рис. 11.2 показаны типичные формы входных и выходных сигналов.
Входы |
Выход |
|
А |
В |
|
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
Таблица 11.1. Таблица истинности схемы И
Таблица 11.2. Таблица истинности схемы И-НЕ
Входы |
Выход |
|
А |
В |
|
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Рис. 11.1. Схема И.
Рис. 11.2. Входные и выходные импульсные сигналы в схеме И с двумя входами
Рис. 11.3. Схема Рис. 11.4. Входные и выходныеимпульсные Рис. 11.5. Схема ИЛИ.
И-НЕ. сигналы в схеме И-НЕ с двумя входами.
Обратите внимание, что на выходе логическая 1 появляется только тогда, когда на обоих входах присутствует 1.
Логическая схема И-НЕ (рис. 11.3 и табл. 11.2)
Логическая схема И-НЕ имеет на выходе логический 0, когда на все ее входы поданы сигналы, соответствующие логической 1. И наоборот, если хотя бы на одномиз входов схемы И-НЕ присутствует 0, на ее выходе появляется 1 (см. рис. 11.4). Таким образом, схема И-НЕ является логической противоположностью схемы И.
Таблица 11.3. Таблица истинности схемы ИЛИ
Входы |
Выход |
|
А |
В |
|
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
Таблица 11.4. Таблица истинности схемы ИЛИ-НЕ
Входы |
Выход |
|
А |
В |
|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
Рис. 11.6. Схема ИЛИ-НЕ.
Рис. 11.7. Входные и выходные импульсные сигналы в схеме ИЛИ-НЕ с двумя входами.
Логическая схема ИЛИ (рис, 11.5 и табл. 11.3)
Логическая схема ИЛИ дает на выходе 1, если хотя бы на одном из ее входов присутствует 1. Логический 0 появляется на ее выходе только в том случае, если на всех ее входах действуют логические 0.
Логическая схема ИЛИ-НЕ (рис. 11.6 и табл. 11.4)
Схема ИЛИ-НЕ дает на выходе 0, если хотя бы на одном ее входе присутствует 1. Логическая 1 появляется на ее выходе только тогда, когда на всех ее входах присутствует логический 0. Таким образом, схема ИЛИ-НЕ является логической противоположностью схемы ИЛИ. На рис. 11.7 показаны типичные формы сигналов, действующих в схеме ИЛИ-НЕ.
Логическая схема НЕ (рис. 11.8 и табл. 11.5)
Логическая схема НЕ является инвертором. Когда на ее входе присутствует 1, на выходе появляется 0, и наоборот. Если соединить между собой входы логических схем И-НЕ или ИЛИ-НЕ (рис. 11.8(б) и (в)), то
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
Рис. 11.8. Схема НЕ.
Рис. 11.9. Входные и выходные импульсные сигналы в схеме НЕ.
получится схема инвертора. На рис. 11.9 показаны типичные формы сигналов в схеме НЕ.
Логическая схема Исключающее ИЛИ (рис. 11.10 и табл. 11.6)
Логическая схема Исключающее ИЛИ дает на выходе 1, если только на один ее вход подается 1. Если же на обоих входах присутствуют логические 0 или 1, на выходе появляется логический 0.
Логическая схема Исключающее ИЛИ-НЕ (рис. 11Л1 и табл. 11.7)
Схема Исключающее ИЛИ-НЕ дает на выходе 1, когда на обоих ее входах присутствуют логические 0 или 1.
Рис. 11.10. Схема Исключающее ИЛИ.
Рис. 11.11. Схема Исключающее ИЛИ-НЕ,
Международные стандарты и стандарты Великобритании
На рис. 11.12 показаны условные обозначения, утвержденные международным и британским стандартами для изображении логических схем. Сводные таблицы истинности приведены в табл. 11.8.
Рис. 11.12. Условные обозначения логических схем
Таблица 11.8. Сводные таблицы истинности логических схем
Входы |
Выходы |
||||||
А |
В |
И |
ИЛИ |
И-НЕ |
ИЛИ-НЕ |
Искл. ИЛИ |
Нскл, ИЛИ-НЕ |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
В видео рассказывается о логических элементах И, ИЛИ, НЕ:
Добавить комментарий
Схема лечения ОРВИ с подозрением или подтвержденным COVID-19
Если вы болеете 1-3-ий день, сразу начинайте прием ВСЕХ ниже перечисленных препаратов по пяти пунктам:
1.Один из противовирусных препаратов: ингавирин 90мг 1 т утром 7 дней или арбидол 200 мг*4 р в день или фавиправир по схеме или триазаверин по инструкции или кагоцел по схеме. К этим препаратам нужно добавить капли гриппферон (интерферон альфа) по 3 капли в каждый носовой ход * 5 раз в день, 7 дней или виферон в свечах 500 тыс. ед. * 2раза в день – 7 дней.
- Жаропонижающие препараты: парацетамол 0,5 по 1 табл. до 4 раз в день при лихорадке свыше 38 гр., можно сочетать с ибупрофеном 400мг * 3раза в день или с аспирином 0,5*3раза в день
- Бромгексин 8 мг4р в день или амброксол по 1 т4р (отхаркивающий препарат, также блокирует попадание вируса в клетку), 2 недели.
- Верошпирон 50 мг утром – 2-3 недели( считается слабым мочегонным препаратом, но в данном случае используется для снижения тестостерона, блокады рецепторов АРА 2 на которые садится вирус, уменьшения фиброза легочной ткани, чтобы не было осложнений после перенесенной инфекции, одышки)
- Препараты разжижающие кровь (т.к. коронавирус вызывает воспаление мелких сосудов и в них образуются тромбы) – антикоагулянты — эликвис 2,5 мг*2р или ксарелто 10 мг (15 мг, 20 мг) утром – 3-4 недели. Начать их приме необходимо как можно раньше!!! При невозможности приобретения этих препаратов можно начать прием курантила или дипиридамола по 75 мг * 2раза в день (улучшает микроциркуляцию, для профилактики тромбов) + аспирин 500 мг по ¼ таблетке после ужина.
Длительность лечения, если нет ухудшения состояния, составляет 2 недели, потом можно отменить бромгексин, верошпирон и препараты, разжижающие кровь.
Если у вас на 4-5 (и более) день болезни сохраняется или нарастает температура, появляется одышка, кашель … необходимо ДОБАВИТЬ к лечению следующие препараты: - Противовоспалительные гормональные препараты дексаметазон 0,5 мг по 3-4 табл. в день или метипред (метилпреднизолон) 4 мг по 3-4 табл. в день или преднизолон 5 мг 4 табл. в день принимать в два приема (утро, день), строго после еды, примерно на 7 дней , затем постепенно уменьшать дозу на 0,5 (половину) таблетки 1 раз в 3-5 дней (чем медленней, тем лучше) до полной отмены.
- Увеличиваем дозу антикоагулянтов — эликвис до 5 мг*2р или ксарелто до 20 мг утром на 2 недели, в дальнейшем уменьшаем дозу только по согласованию с врачом.
- Т.к. противовоспалительные препараты раздражают слизистую оболочку желудка, необходимо начать прием следующих препаратов :
- фамотидин 40 мг на ночь или нольпаза 0,02 или омепразол 0,02 по 1 т*2раза в день на весь срок, пока принимаем гормоны)
- присоединяем антибактериальную терапию: азитромицин (сумамед) 500 мг 1 раз в день 5 дней или амоксиклав (флемоклав) 500 мг по 1 табл. 3раза в день на 7- 10 дней или левофлоксацин 500 мг по 1 табл. 2 раза в день 7 дней или другой антибиотик. Возможность выдачи рецепта можно согласовать по указанному телефону или с уч. врачом.
Если состояние с улучшением, то это лечение (кроме антибиотиков) продолжаем до 3-х недель.
Возможно на 5-7 день болезни появление или усиление одышки, подъем температуры, ухудшение общего состояния – нужна более интенсивная терапия, следует позвонить врачу, тел.: 89517340922, 89517341137 .
Дополнительно, с первых дней заболевания, в течении 14 дней , а при необходимости и дольше можно принимать:
- витамин Д ( аквадетрим или вигантол) по 8-10 капель в день ( помогают организму бороться с вирусом, при вирусной инфекции возникает очень сильный дефицит витамина Д, кто пьет, у того инфекция протекает легче)
- препараты цинка 15-50 мг в день (помогают организму бороться с вирусом)
- витамин С по 500 мг в сутки до 1 месяца.
АУТСОРСИНГ В РОССИЙСКИХ МЕТАЛЛУРГИЧЕСКИХ КОМПАНИЯХ: ФИНАНСОВАЯ СХЕМА ИЛИ ЭФФЕКТИВНОЕ ПРЕОБРАЗОВАНИЕ? | Бобошко
1. Горбунова О.А. Механизм реализации аутсорсинга непрофильных бизнес-процессов в металлургической компании // Экономика в промышленности. 2012. № 3. С. 55 – 62.
2. Горбунова О.А. Опыт инновационного аутсорсинга в черной металлургии // Экономика в промышленности. 2011. № 1. С. 61 – 65.
3. Котляров И.Д. Аутсорсинг как особая форма межфирменного сотрудничества // Экономика в промышленности. 2011. № 1. С. 65 – 71.
4. Прудникович О.О., Новиков Е.М. Эффек тивность аутсорсинга погрузочно-разгрузоч ных работ на метал лургическом предприятии // Экономика в промышленности. 2010. № 2. С. 26 – 28.
5. Бодров В.В. Мировые тенденции и опыт организации сервиса технологического оборудования на металлургических предприятиях России // Черная металлургия. http://magnezit.ru/ru/manufacture/mms/ (дата обращения: 15.04.2013).
8. SMS Demag Now SMS Siemag. URL: http://connection.ebscohost.com/c/articles/43029316/smsdemag-now-sms-siemag (дата обращения: 15.04.2013).
9. Совместное предприятие ТМК и SMS Demag не удалось? Новости рынка металлов. URL: www.MetalTorg.ru (дата обращения: 15.04.2013).
10. СП «IBS DataFort Череповец»: инсорсинг как эффективная альтернатива ИТ-аутсорсингу. Сайт Compulog. URL: http://connection.ebscohost.com/c/articles/43029316/sms-demag-now-sms-siemag (дата обращения: 16.04.2013).
11. «ЗАО «Фирма «СТОИК», входящее в дивизион «Северсталь Российская сталь», увеличило объем реализации сервисных услуг на 63 % за I-й квартал 2010 года в сравнении с аналогичным периодом 2009 года». Прайм. Агентство экономической информации. URL: http://www.1prime.ru/INDUSTRY/20100513/755084979.html#photo_0 (дата обращения: 15.04.2013).
12. Стратегия развития металлургической промышленности России на период до 2020 года. Сайт Минпромторга. URL: http://www.minpromtorg.gov.ru/ministry/strategic/sectoral/2 (дата обращения: 17.04.2013).
13. Налоговый кодекс РФ. http://base.garant.ru/10900200/ (дата обращения: 15.04.2013).
14. Белая металлургия. Сайт Группы «ЧТПЗ» http://www.chelpipe.ru/about/white_metals/ (дата обращения: 15.04.2013).
15. Развитие и социальная поддержка персонала. Сайт «Северсталь-групп». http://www.compulog.ru/public_mnenie/28-insorsing_kak_alternativa/ (дата обращения: 15.04.2013).
Каким образом схема или конфигурация ИБП способствуют достижению высокой надежности и эксплуатационной готовности в ЦОД?
Исправная работа центра обработки данных – главное условие успешной ежедневной работы множества организаций. Стоимость минуты простоя из-за отказа слишком высока и может достигать $4000-6000 и более. Использование источников бесперебойного питания (ИБП) – основное условие поддержания непрерывности работы ЦОД. Для поддержания высокой эксплуатационной готовности центра обработки данных очень важно, чтобы ИБП мог сохранять работоспособность при отказе некоторых элементов и имел отказобезопасную конструкцию для повышения надежности системы. Очень важно также, чтобы ИБП обладал гибкостью, позволяющей ему работать в различных конфигурациях, и поддерживал резервирование с целью повышения надежности энергоснабжения.Отказоустойчивость хорошо демонстрируется на примере модульных ИБП. Например, ИБП Delta серии Modulon DPH имеют полностью отказоустойчивую конструкцию, обеспечивающую саморезервирование силовых модулей. Кроме того, интеллектуальное управление позволяет системе самосинхронизироваться в случае отказа ведущего модуля и автоматически переключиться на резервный для обеспечения бесперебойной работы.
Далее, возможность горячей замены критических важных компонентов и модулей повышает ремонтопригодность системы бесперебойного питания, тем самым сокращая среднюю продолжительность ремонта почти до нуля и обеспечивая максимальное время исправной работы и исключительную эксплуатационную готовность ЦОД. Быстрая замена модулей с помощью стандартных процедур может более чем наполовину сократить время ремонта по сравнению с традиционными немодульными ИБП.
Запас надежности – главная конструктивная особенность всех наших ИБП. Отказоустойчивая схема – это следующий шаг, призванный уменьшить количество неисправностей, способных вызвать отказ всей системы, и повысить общую надежность. Иными словами, это гарантия работы ИБП. Большинство ИБП Delta оборудованы отказоустойчивыми схемами вспомогательного питания, управления и т. д.
Вспомогательное питание является основным источником электроэнергии для системы управления ИБП; это сердце ИБП. Неисправность вспомогательного питания может вызвать отказ всей системы бесперебойного питания и способна привести к простоям ЦОД. ИБП Delta проектируются с резервированием вспомогательного питания. В случае исчезновения сетевого напряжения резервный источник вспомогательного питания продолжает подавать напряжение в систему управления, обеспечивая бесперебойную работу ИБП.
В ИБП широко применяется управление на основе цифровой обработки сигнала (DSP), преимущества которого заключаются в уменьшении количества компонентов и числа отказов на единицу времени при повышении общей надежности системы. Но с другой стороны, неисправность управления на основе DSP способна вызвать отказ всей системы бесперебойного питания. Отказоустойчивая схема Delta может обнаружить неисправность цепи управления и автоматически перевести ИБП в режим байпаса, поддерживая непрерывное питание ответственных нагрузок и повышая надежность всей системы.
Когда мы говорим об эксплуатационной готовности, то важным моментом является гибкость конфигурации системы бесперебойного питания. ИБП Delta поддерживают несколько схем резервирования.
- Параллельная конфигурация (N+1), не требующая дополнительного оборудования.
- Конфигурация с горячим резервом, использующая два ввода питания, которая одновременно обеспечивает системное резервирование и высокое качество электроэнергии.
- Конфигурация с двойным резервированием (2N, 2N+1) достигается при синхронизации инверторов на общей шине (см. рис. ниже). Обеспечивает уровень надежности Tier 4 согласно TIA-942 для ответственных нагрузок внутри ЦОД.
ИБП Delta семейства Ultron и Modulon обладают лучшими в своем классе надежностью и продолжительностью безотказной работы. Гарантируя высокую эксплуатационную готовность, они способствуют сокращению эксплуатационных затрат.
Инсайт: память, схема или разрыв?
В ЯрГУ прошел всероссийский научный семинар, посвященный инсайту, в котором приняли участие представители РАНХиГС, ВШЭ и факультета психологии ЯрГУ.
В конце июля на факультете психологии ЯрГУ им. П. Г. Демидова прошел традиционный летний всероссийский научный семинар “Инсайт: факты, методы, теории”. Участники семинара прослушали и обсудили три доклада, авторы которых представили свои концепции интеллектуального феномена, связанного с прорывом в понимании задачи и «неожиданном» нахождении ее решения.
Наработки модели инсайтного решения представил Илья Владимиров, доцент кафедры общей психологии ЯрГУ. Он рассматривает инсайт как подсистему памяти, а не мышления, каковой он традиционно считается. В концепции автора решение инсайтной задачи – не формулировка нового, а забывание старого ответа; отсюда следует функция инсайта как временная блокировка памяти. Она реализуется за счёт изменения фокуса внимания, которое случается несколько раз на протяжении решения задачи. Такая модель позволяет объяснить сложность и подчас невозможность переноса способа инсайтного решения с одной задачи на другую. Если главное в решении – избавиться от прошлого способа, а не создать новый, то переносить оказывается нечего, так как путь решения – это отказ от привычного, готового образа рассуждения. В подтверждение своей модели Илья Владимиров привёл результаты нескольких серий экспериментов.
Второй доклад сделал Сергей Коровкин, доцент кафедры общей психологии ЯрГУ. Его модель инсайтного решения строится вокруг понятия схемы. Именно применение схем позволяет решать инсайтные задачи. Схему составляют как высокоуровневые компоненты, которые определяют работу с задачей в целом, так и низкоуровневые, касающиеся элементов задачи. В первую категорию входят ситуативная модель задачи, ожидание цели и программа действий. Низкоуровневые компоненты – это репрезентация элементов, схемы отдельных действий и образ подцелей. Такая модель инсайтного решения позволяет ответить на один из фундаментальных вопросов: как происходит смена репрезентации задачи? В целом она реализуется на основе анализа основного конфликта задачи, ответа на вопрос, в чём подвох. Переструктурирование осуществляется на низком уровне – как переключение автоматических программ, и на высоком – через поиск готовых моделей решения. Такая модель тоже была сформулирована в результате анализа нескольких серий экспериментов.
Завершил выступления Владимир Спиридонов, профессор, декан факультета психологии Института общественных наук РАНХиГС. Он видит инсайтное решение как серию «разрывов» между этапами, часть которых воспринимается более эмоционально и осознаётся, порождая всем известное чувство озарения, сопровождающее нахождение ответа. Эти «разрывы» происходят между двумя различными типами работы с задачей, например, между исследованием задачи и целенаправленным поиском решения.
Финальным событием семинара стал круглый стол, в ходе которого участники обсудили ряд вопросов, посвященных инсайту. Так, была поставлена проблема единства инсайта: существует ли некий общий процесс, позволяющий объяснить всё многообразие решений задач? Из этой дискуссии вытекла терминологическая проблема: сам термин «инсайт» имеет большое количество трактовок и связанных понятий. Например, под инсайтом может подразумеваться и механизм, позволяющий находить решение, и переживание озарения, и событие – получение ответа.
В работе семинара принимали участие не только специалисты, изучающие инсайт, но и учёные из смежных областей когнитивной психологии. Дискуссия позволила узнать, в каком ключе они рассматривают исследования инсайта. Игорь Уточкин, профессор, заведующий научно-учебной лабораторией когнитивных исследований ВШЭ, отметил, что специалисты в области внимания и восприятия тоже используют подобные задачи, но как средство отслеживания осознанности. Он посоветовал при изучении инсайта меньше опираться на конструкт рабочей памяти, поскольку он недостаточно чётко сформулирован. Исходя из тезиса Ильи Владимирова о том, что инсайт может быть подсистемой памяти, а не мышления, он предложил проверить, нельзя ли свести инсайт к перцепции, когнитивному процессу прямого активного отображения человеком разных явлений, объектов, событий, ситуаций.
Его позицию поддержала Елена Горбунова, доцент, заведующая научно-учебной лабораторией когнитивной психологии пользователя цифровых интерфейсов ВШЭ. Она сделала акцент на том, что исследования инсайта очень сложны с точки зрения дизайна, и предложила провести эксперимент, в котором будет варьироваться только одна переменная, чтобы получить более простые и надёжные выводы.
Максим Морозов, научный сотрудник научно-исследовательской лаборатории когнитивных исследований РАНХиГС, обратил внимание на то, что большинство моделей инсайта имеют недостаточную объяснительную мощность, лишь описывая процесс. Из-за этого многие концепции позволяют интерпретировать все экспериментальные результаты. Потому он предложил отталкиваться от вопросов, ответы на которые прежде всего должны быть получены в рамках экспериментов. Круглый стол завершился попыткой очертить круг самых важных вопросов в области инсайта и неоспоримых фактов, связанных с этим феноменом.
Семинар проводился в несколько необычном формате: главной целью было представление и обсуждение новых моделей инсайтного решения. Отсутствие ограничения по времени позволило докладчикам тщательно рассмотреть все аспекты своих моделей, а слушатели успели получить ответы на все вопросы. Участники семинара отметили необычность и удобство такого подхода к организации обсуждения научных проблем.
Полина Маркина
факультет психологии ЯрГУ
if, cond, and, and or
3.12 Условные выражения: if, cond, and, and or
Условные выражения в The Racket Guide вводят условные выражения.
Оценивает test-expr. Если он дает любое значение, кроме #f, затем вычисляется then-expr, и его результаты результат для формы if. В противном случае else-expr будет оценивается, и его результаты являются результатом для if форма.Then-expr и else-expr находятся в хвосте положение относительно формы if.
(если test-expr, то expr else-expr)
Примеры:
(условное условие …)
условное предложение = [test-expr then- кузов … +] | [иначе кузов … +] | [test-expr => proc-expr] | [test-expr]
Условное предложение, которое начинается с else, должно быть последним условная оговорка.
Если условия не указаны, результатом будет #
Если присутствует только [else then-body … +], то затем оцениваются тела. Результаты всех, кроме последнего then-body игнорируются. Итоги последнего затем-тело, которое находится в положении хвоста по отношению к cond form, это результаты для всего cond форма.
В противном случае оценивается первое тестовое выражение. Если он производит #f, то результат такой же, как и в форме cond с остальные условия условия в хвостовой позиции по отношению к исходная форма конд.В противном случае оценка зависит от форма условия условия:
[test-expr then-body … +] Затем-тела оценивается по порядку, и результаты всех, кроме последнего then-body игнорируются. Итоги последнего затем-тело, которое находится в положении хвоста по отношению к форма cond, предоставляет результат для всего cond форма.
[test-expr => proc-expr] proc-expr оценивается, и он должен произвести процедуру, которая принимает один аргумент, в противном случае возникает исключение exn: fail: contract.Процедура применяется к результату test-expr в хвостовой позиции относительно выражение cond.
Результат test-expr возвращается как результат формы cond. В test-expr не находится в хвостовой позиции.
Примеры:
Особо распознается в таких формах, как cond.An else форма как выражение является синтаксической ошибкой, особенно в таких формах, как cond. А => форма как выражение является синтаксической ошибкой.
> (конд) 5
‘здесь
‘ (-2-3)
‘(2 3)
Если выражения не указаны, результатом будет #t.
Если указано одно выражение, то оно находится в хвостовой позиции, поэтому результаты выражения и являются результатами выраж.
В противном случае оценивается первое выражение. Если он производит #f результатом выражения и является #f. В противном случае результат будет таким же, как и выражение с остальными выражениями в хвостовой позиции с уважение к оригиналу и форме.
Примеры:
Если выражения не указаны, результатом будет #f.
Если указано одно выражение, то оно находится в хвостовой позиции, поэтому результаты выражения или являются результатами выраж.
В противном случае оценивается первое выражение. Если он производит значение, отличное от #f, этот результат является результатом или выражение. В противном случае результат будет таким же, как у или выражение с оставшимися выражениями в хвосте положение относительно оригинала или формы.
Примеры:
CSE 341 – Основы схемы
CSE 341 – Основы схемыСхема профиля
- диалект Лисп
- в основном функциональные (но не чисто функциональные)
- динамический набор текста; тип безопасный
- Хранилище исключительно на основе кучи с GC
- передача по значению с семантикой указателя
- с лексической областью видимости (изначально Lisp использовал динамическую область видимости)
- первоклассные функции
- анонимных функций
- синтаксически простой, обычный (но с множеством скобок)
- все списками! Эквивалентность
- программных данных (Это делает его легко писать программы на схеме, которые обрабатывают / производят другие программы, e.грамм. компиляторы, редакторы структур, отладчики и т. д.)
- обычно можно запускать либо интерпретировать, либо скомпилировать
Области применения Лиспа:
- AI (экспертные системы, планирование и т. Д.)
- Симуляторы, Моделирование
- Программирование приложений (emacs, CAD, Mathematica)
- Быстрое прототипирование
Типы данных и операции примитивной схемы
Некоторые примитивные ( атомарные ) типы данных:- номеров
- целых чисел (примеры: 1, 4, -3, 0)
- реалов (примеры: 0,0, 3,5, 1,23E + 10)
- рациональных чисел (например, 2/3, 5/2)
- символов (например, fred, x, a12, set!)
- boolean: Схема использует специальные символы #f и #t для обозначения false и правда.
- строк (например, “привет, моряк”)
- символов (например, # \ c)
- Арифметические операторы (+, -, *, /, абс, sqrt)
- Отношения (=, <,>, <=,> =) (для чисел)
- Relational (eqv ?, equal?) Для произвольных данных (подробнее об этом позже)
- Логическое (и, или, не): и и или являются логическими операторами короткого замыкания.
- номер? целое число? пара? символ? логическое? нить?
- экв? равный?
- = <> <=> =
Операторы применения, функции
Итак, мы знаем названия группы операторов.Как мы их используем? Схема предоставляет нам единый синтаксис для вызова функций:(функция arg1 arg2 ... argN)
Это означает, что все операторы, в том числе арифметические, имеют Префикс Синтаксис . Аргументы передаются по значению (кроме специальные формы , обсуждаемые позже, чтобы учесть такие приятные вещи, как короткое замыкание).
Примеры:(+ 2 3) (абс -4) (+ (* 2 3) 8) (+ 3 4 5 1) ;; обратите внимание, что + и * могут принимать произвольное количество аргументов ;; на самом деле так может - и / но у вас заболит голова, пытаясь вспомнить ;; что это значит ;; ;; точка с запятой означает, что оставшаяся часть строки является комментарием
Тип данных списка
Возможно, самый важный встроенный тип данных в Scheme – это список.В схеме списки неограниченны, возможно, неоднородны. коллекции данных. Примеры:(Икс) (Элмер Фадд) (2 3 5 7 11) (2 3 x y "зоопарк" 2.9) ()Представление списков в виде прямоугольников и стрелок:
_______________ ________________ | | | | | | | о | ---- | -----> | о | о | | ___ | ___ | _______ | | ____ | ___ | ___ | ___ | | | | | | | Элмер Фадд ()Или же
_______________ _____________ | | | | | / | | о | ---- | -----> | о | / | | ___ | ___ | _______ | | ____ | ___ | / ___ | | | | | Элмер Фадд
Заметки:
- (x) не то же самое, что x
- () – пустой список
- Списки списков: ((a b) (c d)) или ((fred) ((x))) Списки схем
- могут содержать элементы разных типов: (1 1.5 х (а) ((7)))
- length – длина списка
- равно? – проверить, равны ли два списка (рекурсивно)
- вагон – первый элемент списка
- cdr – остальная часть списка
- cons – создать новую ячейку списка (также известную как cons-ячейка )
- список – составить список
(Для вашего удобства Scheme также предопределяет составы вагон
и цдр
, эл.г., (кадр с)
определить
d как (автомобиль (cdr s))
.)
- null? – список пуст?
- пара? – это непустой список?
Вычисление выражений
Пользователи обычно взаимодействуют со схемой через чтение-оценка-печать. петля ( REPL ). Схема ожидает, пока пользователь наберет выражение, читает его, оценивает и печатает возвращаемое значение. Выражения схемы (часто называемые S-выражениями , для Символические выражения ) либо списки, либо атомы.Списки состоит из других S-выражений (обратите внимание на рекурсивное определение). Списки часто используются для представления вызовов функций, где список состоит из имени функции, за которым следуют ее аргументы. Однако списки также может использоваться для представления произвольных наборов данных. В этих заметках мы обычно пишем:когда мы хотим показать S-выражение и оценка этого S-выражение. Например:=>
(+ 2 3) => 5 (минусы 1 ()) => (1)Правила оценки:
- Числа, строки, #f и #t являются литералами, то есть они оцените для себя.
- Символы рассматриваются как переменные, и для их оценки их привязки ищутся в текущей среде.
- Для списков первый элемент определяет функцию. Остальные
элементы списка указывают аргументы. Оцените первый элемент
в нынешних условиях
найти функцию и
оценить каждый из
аргументы в текущей среде и вызывают функцию для этих значений.
Например:
(+ 2 3) => 5 (+ (* 3 3) 10) => 19 (= 10 (+ 4 6)) => #t
Использование символов (атомов) и списков в качестве данных
Если мы попробуем оценить (список elmer fudd) мы получим ошибку.Почему? Так как Схема будет рассматривать атом elmer как имя переменной и пытаться искать за его привязку, которую он не найдет. Поэтому нам нужно “процитировать” имена Элмер и Фадд, что означает, что мы хочу схему относиться к ним буквально. Схема предоставляет для этого синтаксис. Оценка цитируемых объектов заключается в том, что цитируемый объект оценивает сам себя.'х => х (список elmer fudd) => ошибка! Элмер - это несвязанный символ (список 'elmer' fudd) => (elmer fudd) (элмер фадд) => ошибка! Элмер - неизвестная функция '(элмер фадд) => (элмер фадд) (равно? (x) (x)) => ошибка! x - неизвестная функция (равно? '(x)' (x)) => #t (cons 'x' (y z)) => (x y z) (cons 'x ()) => (x) (автомобиль '(1 2 3)) => 1 (cdr (cons 1 '(2 3))) => (2 3)Обратите внимание, что есть 3 способа составить список:
- ‘(x y z) => (x y z)
- (cons ‘x (cons’ y (cons ‘z ()))) => (x y z)
- (список ‘x’ y ‘z) => (x y z)
'х => х (цитата x) => x(Алан Перлис: «синтаксический сахар вызывает рак точки с запятой».)
Переменные
Схема имеет как локальные, так и глобальные переменные. В схеме переменная имя, которое привязано к некоторому объекту данных (с помощью указателя). Там не являются объявлениями типов для переменных. Правило оценки символы: символ оценивает значение переменной, которую он называет. Мы может связывать переменные с помощью специальной формы , определяющей :(определить символьное выражение)
Используя , определите
связывает символ
(ваша переменная
name) к результату вычисления выражения
. define
– это особая форма, потому что первый параметр, символ
, не оценивается.
В строке ниже объявляется переменная с именем clam (если она не существует) и относит его к 17:
(определить моллюск 17) моллюск => 17 (определите моллюск 23); это восстанавливает моллюска до 23 (+ моллюск 1) => 24
(определите bert '(a b c)) (определите Эрни Берта)Схема использует указатели: теперь bert и ernie указывают на один и тот же список.
В 341 мы будем использовать определение только для привязки глобальных переменных, и мы не будет повторно связывать их после того, как они будут связаны, кроме случаев отладки.
Переменные с лексической областью видимости с let и let *
Мы используем специальную форму для объявления и привязки локальных, временные переменные. Пример:;; общая форма let (пусть ((имя1 значение1) (имя2 значение2) ... (имяN значениеN)) выражение1 выражение2 ... выражениеQ) ;; переверните список и удвойте его ;; менее эффективная версия: (определить (r2 x) (добавить (обратный х) (обратный х))) ;; более эффективная версия: (определить (r2 x) (пусть ((r (обратный x))) (добавить r r)))Одна проблема с Let заключается в том, что пока создаются привязки, выражения не могут ссылаться на привязки, которые были сделаны ранее.Например, это не работает, поскольку x неизвестен вне тела:
(пусть ((x 3) (у (+ х 1))) (+ х у))Чтобы обойти эту проблему, Scheme предоставляет нам let *:
(пусть * ((x 3) (у (+ х 1))) (+ х у))
Определение собственных функций
Лямбды: анонимные функции
Вы можете использовать специальную форму лямбда
для создания
анонимные функции. Эта специальная форма занимает
(лямбда (param1 param2... парамк); список официальных лиц expr); тело
лямбда-выражение
вычисляет анонимную функцию
который при применении (выполнении) принимает k аргументов и возвращает
результат вычисления expr
. Как и следовало ожидать,
параметры имеют лексическую область видимости и могут использоваться только в выражение
.
Пример:
(лямбда (x1 x2) (* (- x1 x2) (- x1 x2)))
Оценка приведенного выше примера приводит только к анонимной функции,
но мы пока ничего не делаем.Результат лямбда-выражение
можно напрямую применить, предоставив
аргументы, как в этом примере, который оценивается как 49:
((лямбда (x1 x2) (* (- x1 x2) (- x1 x2))) 2-5);Определение именованных функций
Если вы столкнетесь с проблемой определения функции, вы часто захотите сохраните его для дальнейшего использования. Вы добиваетесь этого, привязывая результат
лямбда
в переменную, используя, определяют
, так же, как вы бы с любым другим значением.(Это показывает, как функции первоклассный по схеме. Это использованиеопределяет, что
нет отличается от привязки переменных к другим видам значений.)(определить квадратную разницу (лямбда (x1 x2) (* (- x1 x2) (- x1 x2))))Поскольку определение функций - очень распространенная задача, Scheme предоставляет специальная версия ярлыка
определяет
, который не используетлямбда
явно:(определить (имя-функции param1 param2... парамк) выражение)Вот еще несколько примеров использования
, определение
в этом путь:(определить (двойной x) (* 2 х)) (двойной 4) => 8 (определить (по шкале Цельсия по Фаренгейту c) (+ (* 1,8 с) 32,0)) (Цельсия к Фаренгейту 100,0) => 212,0x
в функцииdouble
является формальным параметр. Он имеет область видимости только внутри функции. Рассмотрим три разныеx
вот здесь ...(определить x 10) (определить (добавить1 x) (+ х 1)) (определить (дважды добавить x) (двойной (добавить1 х))) (дважды добавить x) => 22Функции могут принимать 0 аргументов:
(определить (тест) 3) (тест) => 3Обратите внимание, что это не то же самое, что , как привязка переменной к значение:
(определите не-функцию 3) не-функция => 3 (not-a-function) =>; Объект 3 не применим.Равенство и идентичность: равно ?, eqv ?, eq?
Схема предоставляет три примитива для проверки равенства и идентичности:Примеры:
- экв? сравнение указателей. Он возвращает #t, если и только если его аргументы буквально относятся к одним и тем же объектам в памяти. Символы уникальны ('Фред всегда оценивает один и тот же объект). Два символа, которые выглядят одинаково, называются ур. Две переменные которые относятся к одному и тому же объекту, являются ур.
- экв? как эк? но поступает правильно при сравнении числа.экв? возвращает #t, если и только если его аргументами являются уравнение или , если его аргументы - числа, которые имеют такое же значение. экв? не преобразовать целые числа в числа с плавающей запятой при сравнении целых чисел и чисел с плавающей запятой.
- равно? возвращает истину, если его аргументы имеют одинаковую структуру. Формально можно определить равный? рекурсивно. равный? возвращает #t, если его аргументы равны eqv, или если его аргументы - списки, соответствующие элементы которых равны (обратите внимание на рекурсию). Два объекта, которые являются эквалайзером, являются как eqv, так и равный.Два объекта которые равны, но не обязательно эк. Два объекта, которые равны не обязательно равны или экв. эквалайзер иногда называется личность сравнение и равенство называется сравнением на равенство.
(определить моллюск '(1 2 3)) (дайте определение моллюска осьминога); моллюск и осьминог относятся к одному списку (eq? 'clam' clam) => #t (eq? clam clam) => #t (eq? осьминог моллюска) => #t (eq? clam '(1 2 3)) => #f; (или (), в схеме MIT) (eq? '(1 2 3)' (1 2 3)) => #f (уравнение? 10 10) => #t; (обычно, но зависит от реализации) (уравнение? 10.0 10.0) => #f; (обычно, но зависит от реализации) (eqv? 10 10) => #t; всегда (eqv? 10.0 10.0) => #t; всегда (eqv? 10.0 10) => #f; нет преобразования между типами (равно? clam '(1 2 3)) => #t (равно? '(1 2 3)' (1 2 3)) => #tСхема дает=
для сравнения два числа, и будет принуждать один тип к другому. Например,(равно? 0 0,0)
возвращает#f
, но(= 0 0.0)
возвращает#t
.Логические операторы
Схема предоставляет нам несколько полезных логических операторов, в том числе и, или, и не. Операторы и и / или являются особой формой и не обязательно оцените все аргументы. Они просто оценивают столько аргументов, сколько необходимо чтобы решить, возвращать ли#t
или#f
(например, символы && и || операторы в C ++). Однако можно было легко написать версию, которая оценивает все ее аргументы.(и expr1 expr2 ... expr-n) ; вернуть истину, если все выражения верны ; ... или, точнее, вернуть expr-n, если все expr оцениваются как ; что-то кроме #f. В противном случае верните #f (и (равно? 2 3) (равно? 2 2) #t) => #f (или expr1 expr2 ... expr-n) ; вернуть истину, если хотя бы одно из выражений истинно ; ... или, точнее, вернуть expr-j, если expr-j - первое выражение, которое ; оценивается не как #f. В противном случае верните #f. (или (равно? 2 3) (равно? 2 2) #t) => #t (или (равно? 2 3) 'fred (equal? 3 (/ 1 0))) =>' фред (определить (однозначный x) (и (> x 0) (#tЛогические особенности
В R4 схемы пустой список эквивалентен #f, а все остальное - эквивалент #t.Однако в R5 пустой list также эквивалентен #t! Мораль: используйте только #f и #t для логических значений константы.Условные
в специальной форме
(если условие true_expression false_expression)
Если
условие
истинно, то результат оценкаtrue_expression
возвращается; в противном случае результат вычисленияfalse_expression
возвращается. if - это особая форма, например,, цитата
, потому что она , а не , автоматически оценивает все свои аргументы.(если (= 5 (+ 2 3)) 10 20) => 10 (если (= 0 1) (/ 1 0) (+ 2 3)) => 5 ; обратите внимание, что (/ 1 0) не оценивается (определить (my-max x y) (если (> x y) x y)) (мой-макс 10 20) => 20 (определить (my-max3 x y z) (если (и (> x y) (> x z)) Икс (если (> y z) y з)))cond - более общий условный
Общая форма специальной формы cond:(cond (test1 expr1) (test2 expr2) .... (иначе выражение))Как только мы находим тест, который соответствует действительности, мы оцениваем соответствующее выражение и вернуть его значение. Остальные тесты не оценивается, а все остальные выражения не оцениваются. Если ни один из тестов не дает истинного значения, мы оцениваем выражение exprn ("else" part) и верните его значение. (Вы можете оставить остальную часть, но это не так хороший стиль.)(определить (погода f) (cond ((> f 80) 'слишком жарко) ((> f 60) 'красиво) ((
Стиль комментирования
Если Scheme находит строку текста с точкой с запятой, остальная часть строки (после точки с запятой) рассматривается как пробел.Однако часто используемый соглашение заключается в том, что одна точка с запятой используется для короткого комментария в строке код, две точки с запятой используются для комментария внутри самой функции строка, а три точки с запятой используются для вводного или глобального комментария (вне определения функции).
Синонимы схемы | Тезаурус Мерриам-Вебстера
1 умный, часто закулисный способ достижения цели- электронная почта схема , чтобы обмануть неосторожных пользователей Интернета, чтобы они раскрыли пароли и финансовую информацию
- искусство,
- устройство,
- уловка,
- выборка,
- бездельник,
- гамбит,
- трюк,
- джиг,
- жонглирование,
- ловкость,
- играть,
- уловка,
- уловка,
- шенаниган,
- ловкость,
- стратагема,
- трюк,
- хитрый
- обман,
- шиканери,
- cozenage,
- ремесло,
- мошенничество,
- хитрость,
- обман,
- дупери,
- двуличие,
- подделка,
- жонглирование,
- legerdemain,
- skulduggery
- (или skullduggery),
- уловка,
- мошенничество,
- обман
- Схема по похищению дочери президента
- a схема для модернизации системы общественного транспорта города
- композиция,
- чертеж,
- дизайн,
- игра,
- план на игру,
- план,
- генеральный план,
- план,
- программа,
- проект,
- дорожная карта,
- стратегия,
- система
- городской инспектор составил план , чтобы не обращать внимания на нарушения кодекса подрядчиком в обмен на существенную взятку
существительных – Разница между «схемой» и «схемой»
Ключевым здесь является третье определение схемы, определение Канта; если он не тот парень, который заново ввел старую латинскую форму слова, то он определенно тот парень, который популяризировал это слово и довел до такого общего употребления в нашем современном языке.Etymology Online и Google Ngrams помещают свою запись на английский язык примерно в то же время, что и работа Канта; Словари Вебстера и несколько других помещают его примерно 60 или 70 лет спустя. Разница, вероятно, связана с недостаточной популярностью или обычным использованием, поскольку этот термин медленно внедрялся в стандартный английский язык.
В любом случае, идея Канта о «схеме», если перевести ее в наше нынешнее понимание, является чем-то вроде «фундаментального интуитивного принципа упорядочения, который люди используют для установления категорий, ментальных, сенсорных или« трансцендентальных ».«Например, категория« количество »должна быть упорядочена по числу; таким образом,« число »является« схемой »ментальной категории, которую мы понимаем как« количество ».
«Схема», однако, – это, по сути, план или идея, которую человек реализует для достижения определенной цели; но бывают исключения, например, когда мы говорим «цветовая схема». Если бы мы все говорили более строго, это, вероятно, было бы «цветовая схема», но на самом деле «схема» и «схема» – очень, очень близкие слова, оба произошли от одного древнегреческого слова, и поэтому при случайном использовании могут кажутся взаимозаменяемыми для таких людей, как вы и я.Поскольку ученые больше не полагаются на «схему» как на важный термин научной практики или дебатов, она утратила институциональную строгость, которой когда-то пользовалась, и теперь медленно трансформируется вместе с «схемой».
За исключением одного случая: схема никогда не является глаголом и может быть только существительным. Вот где возникает путаница; «Схема» раньше была строго обсуждаемым научным термином, частью «мета-дискуссии», которая окружала раннюю науку, но эта эпоха, по сути, давно исчезла.Теперь, когда отсутствует какой-либо формальный корпус использования, «схема» в основном просто парит на краю нашего стандартного словаря, пока кому-то не понадобится четко очерченное существительное для «абстрактного принципа упорядочения» или чего-то в этом роде.
Но часто люди достаточно ленивы, чтобы просто отбросить “а” и использовать это слово как “схема”, так что …..
Существительное( en имя существительное )
цитирование, проход = «Движущаяся платформа» схема
http: или news: .Примечания по использованиюВ США этот термин обычно имеет окольную окраску, а в Великобритании часто используется как нейтральный термин для обозначения проектов: «Дорога закрыта из-за схемы расширения тротуара.”Синонимы* ( систематический план будущих действий ) планГлагол( схема )цитата, страница = , пассаж = В откровенно нелепом сюжете капитан пиратов (Хью Грант) замышляет , чтобы выиграть конкурс «Пират года», хотя он ужасный пират, которого намного превосходит соперников, озвученных Джереми Пивеном и Сальмой Хайек.}} Список литературы* —- | АнглийскийСуществительное( существительное )Синонимы* ( универсально применимое изображение или контур ) схема * ( баз ) схема * ( logic ) схема аксиомы, схемаПроизводные условия* концептуальная схема * логическая схема * физическая схемаСвязанные термины* схематично (al)]] [[схематично, (ly) * схематизм * схемотехник * схематизация * схематизировать * схематологически * схематомантия * схемаАнаграммы* * |
Простая схема: Введение в информатику, глава 8: Функции высшего порядка
Превращение функциональных машин в лемехи Схема Simply Scheme: Введение в информатику, глава 8: Функции высшего порядкаСхема Simple: Введение в информатику 2 / e Copyright (C) 1999 MIT
Глава 8
Примечание: если вы читали часть IV перед этой, притворимся, что не читали; мы собираюсь разработать другую технику для решения подобных задач.
Вы можете использовать функцию сначала
, чтобы найти первую букву
слова. Что делать, если вы хотите найти первые буквы нескольких слов? Ты
сделал это в первой главе, как часть процесса поиска сокращений.
Чтобы начать с простого случая, предположим, что у вас есть два слова (то есть предложение
длины два). Вы можете применить процедуру , первую
к каждому из них и
объединить результаты:
(определить (два первых отправлены) (se (первый (первый отправленный)) (первая (последняя отправленная)))) > (два первых '(джон леннон)) (J L) > (два первых (джордж харрисон)) (G H)Точно так же вот версия для трех слов:
(определить (отправлено три первых) (se (первый (первый отправленный)) (первый (первый (парень отправлен))) (первая (последняя отправленная)))) > (три первых '(джеймс пол маккартни)) (J P M)Но такой подход стал бы утомительным, если бы у вас было предложение из пяти слова – вам придется написать процедуру специально для случая точно пять слов, и эта процедура будет иметь пять отдельных подвыражений для извлечь первое слово, второе слово и т. д.Кроме того, вы не хотите отдельную процедуру для каждой длины предложения; тебе нужна одна функция это работает независимо от того, как долго будет приговор. Используя инструменты, которые вы уже узнал, единственный возможный способ сделать это было бы красиво отвратительный:
(определить (первые письма отправлены) (cond ((= (количество отправлено) 1) (отправлено одним первым)) ((= (количество отправленных) 2) (отправлено два первых)) ((= (подсчет отправлено) 3) (отправлено три первых)) … и так далее …))
Но даже это не сработает, потому что нет возможности сказать «и так далее» на схеме.Вы можете написать версию, которая работает для всех предложения длиной, скажем, 23, но у вас будут проблемы, если кто-то пытался использовать вашу процедуру в предложении из 24 слов.
Каждые
Чтобы написать лучшую процедуру с первой буквой любой длины, вы должны уметь произносить
“применить функцию сначала
к каждые слова в предложении, нет
независимо от того, как долго будет приговор “. Схема дает возможность сделать
это: [1](определить (первые письма отправлены) (каждый первый отправленный)) > (первые буквы '(вот и солнце)) (Ч С Т С) > (первые буквы '(Люси в небе с бриллиантами)) (L I T S W D)
Каждый
принимает два аргумента.Второй аргумент – это предложение, но
во-первых, что-то новое: процедура , используемая как аргумент другой процедуры. [2] Обратите внимание, что слово первый
не заключено в круглые скобки.
в теле первых букв
! К настоящему времени вы уже привыкли
видеть круглые скобки всякий раз, когда вы видите имя функции. Но скобки
указывают на вызов функции , и здесь мы не вызываем первым
. Мы используем сначала
, саму процедуру, в качестве аргумента.
на каждые
.> (до последнего '(пока моя гитара тихонько плачет)) (E Y R Y S) > (каждые - '(4 5 7 8 9)) (-4-5-7-8-9)В этих примерах используется
каждые
с примитивными процедурами, но
Конечно, вы также можете определять свои собственные процедуры и применять их к каждые
слово предложения:(определить (множественное число) (если (равно? (последнее существительное) 'y) (слово (bl имя существительное) 'ий) (слово существительное))) > (каждое множественное число '(черепаха битл холли кинк зомби)) (BEATLES TURTLES HOLLIES KINKS ZOMBIES)
Вы также можете использовать слово в качестве второго аргумента для каждые
.В таком случае,
процедура первого аргумента применяется к каждой букве слова. В
результаты собраны в предложение.
(определить (двойная буква) (слово буква буква)) > (каждая двойная девушка) (GG II RR LL) > (каждый квадрат 547) (25 16 49)
До сих пор во всех этих примерах первый аргумент для каждые
был
функция, которая возвращала слова, и значение, возвращаемое каждые
было предложением, содержащим все возвращенные слова.
Первый аргумент каждые
также может быть функцией, которая возвращает предложения. В этом случае каждые
возвращает одно длинное предложение:
(определить (послано из первых двух ср.) (se (first wd) (first (bf wd)))) > (каждый посланный двумя первыми (внутренний свет)) (T H I N L I) > (каждый отправленный из первых двух (скажите мне, что вы видите)) (Т Е М Е В Х Й О С Е) > (определить (g wd) (se (слово 'with wd)' ты)) > (каждые g '(выходят)) (В ТЕБЕ БЕЗ ВАС)
Функция, которая принимает другую функцию в качестве одного из своих аргументов, как , каждый из которых выполняет
, называется функцией высшего порядка. Если сосредоточить внимание на процедурах, то механизм, посредством которого
Схема вычисляет функции, мы думаем о каждые
как о процедуре
который принимает в качестве аргумента другую процедуру – более высокого порядка
процедура.
Пауза для размышлений
Ранее мы использовали метафору «функциональной машины» с
бункер наверху, в который мы бросаем данные, и желоб на
дно, с которого падает результат, как на мясорубке. Хорошо, каждые
– это функциональная машина, в бункер которой мы бросаем другую
функция машины! Вместо мясорубки у нас металлическая
болгарка.[3]
Вы понимаете, какая это интересная идея? Мы привыкли думать о числах и предложениях как о «реальных вещах», а функции меньше похожи на вещи и больше похожи на действия. В качестве аналогии подумайте о кулинарии. Настоящая еда – это мясо, овощи, мороженое, и так далее. Вы не можете съесть рецепт, который аналогичен функция. Рецепт должен быть применен к ингредиентам, и результат выполнения рецепта съедобная еда. Это казалось бы странным если в рецепте использовались другие рецепты в качестве ингредиентов: «Разогрейте духовку на 350 и вставьте свой Joy of Cooking. ”Но в схеме мы может это сделать. [4]
Готовить свою кулинарную книгу необычно, но общий принцип – нет. В некоторых случаях мы относимся к рецептам как к вещам, а не как алгоритмы. Например, люди пишут рецепты на карточках и кладут их в коробку с файлом рецептов. Затем они выполняют такие операции, как поиск для конкретного рецепта, сортировка рецептов по категориям (основное блюдо, десерт и т. д.), копирование рецепта друга и т. д. Тоже самое рецепт – это и процесс (когда мы готовим с ним), и объект процесса (когда мы его регистрируем).
Сохранить
Как только у нас появится эта идея, мы сможем использовать функции функций для обеспечения многих разные возможности.
Например, функция keep
принимает предикат и предложение как
аргументы. Он возвращает предложение, содержащее только слова аргумента
предложение, для которого сказуемое верно.
> (четные? '(1 2 3 4 5)) (2 4) > (определить (концы-е? слово) (равно? (последнее слово) 'е)) > (держать концы-е? '(пожалуйста, положите салями над синим слоном)) (ПОЖАЛУЙСТА, ВЫШЕ СИНИЙ) > (сохранить номер? '(1 после 909)) (1 909)
Keep
также примет слово в качестве второго аргумента.В этом случае это
применяет предикат к каждой букве слова и возвращает другое слово:
> (сохранить номер? 'Zonk23hey9) 239 > (определить (гласная? буква) (член? буква '(а е я о у))) > (держать гласную? 'поросята) IIE
Когда мы использовали каждые
для выбора первых букв слов
ранее мы находили первые буквы даже неинтересных слов, таких
как “.” Мы работаем над процедурой аббревиатуры, и для этого
Цель, которую мы хотели бы иметь возможность отбросить скучные слова.
(определить (реальное слово? Wd) (not (member? wd '(a an in of and for to with)))) > (держите слово? '(Люси в небе с бриллиантами)) (ЛЮСИ НЕБО БРИЛЛИАНТЫ) > (каждый первый (держите слово? '(Люси в небе с бриллиантами))) (L S D)
Накопить
В каждые
и сохраняют
, каждый элемент второго аргумента
вносит независимо в общий результат. То есть каждые
и сохраняют, что
применяет процедуру к одному элементу за раз.В
Общий результат – это набор отдельных результатов без взаимодействия
между элементами аргумента. Это не позволяет нам говорить такие вещи, как “Добавить
вверх все числа в предложении, “где желаемый результат – функция
всего предложения аргумента, взятого в целом. Мы можем сделать это с помощью
процедура с именем накапливает
. Накопить
выполняет процедуру и
предложение в качестве аргументов. Он применяет эту процедуру к двум словам
предложения. Затем применяется процедура
к результату мы получили и еще один элемент предложения, и так далее.Он заканчивается, когда все слова предложения объединяются в один результат.
> (накопить + '(6 3 4-5 7 8 9)) 32 > (накапливайте слово '(a c l u)) ACLU > (накопить макс. '(128 32 134 136)) 136 > (определить (поставить дефис слово1 слово2) (слово слово1 '- слово2)) > (накапливать дефис '(об ла ди об ла да)) ОБ-ЛА-ДИ-ОБ-ЛА-ДА
(Во всех наших примерах в этом разделе второй аргумент содержит как минимум два элемента. В разделе «подводные камни» в конце В этой главе мы обсудим, что происходит с меньшими аргументами.)
Accumulate
также может принимать слово в качестве второго аргумента, используя
буквы как элементы:
> (накопить + 781) 16 > (накапливайте предложение 'colin) (C O L I N)
Объединение функций высшего порядка
Что, если мы хотим сложить все числа в предложении, но игнорировать слова это не числа? Сначала мы сохраняем
чисел в предложении, затем
мы накапливаем
результат с +
. На схеме проще сказать:(определить (добавочные номера отправлены) (накопить + (сохранить номер? отправлено))) > (сложение цифр '(4 кричащих птицы 3 курицы 2 голубя-черепахи)) 9 > (add-numbers '(1 за деньги 2 за шоу 3, чтобы подготовиться и 4 в ходу)) 10
У нас также достаточно инструментов для написания версии процедуры count
,
который находит количество слов в предложении или количество букв в
слово.Сначала мы определим процедуру always-one
, которая возвращает 1 нет
независимо от того, каков его аргумент. Мы будем каждый всегда-один
по нашему аргументу
предложение, [5] что приведет к предложению как
столько, сколько слов было в исходном предложении. Тогда мы можем использовать накапливает
с +
, чтобы сложить единицы. Это немного
круговой подход; позже мы увидим более естественный способ найти счетчик
предложения.
(определить (всегда один аргумент) 1) (определить (количество отправленных) (Накопить + (каждый всегда-один отправлен))) > (count '(продолжение истории счета за бунгало)) 6Теперь вы можете понять процедуру аббревиатуры
из главы 1:(определить (аббревиатура) (накапливать слово (каждое первое (сохранять слово? фразу)))) > (аббревиатура '(сокращенный набор команд компьютера)) RISC > (аббревиатура '(структура и интерпретация компьютерных программ)) SICP
Выбор подходящего инструмента
До сих пор вы видели три функции высшего порядка: каждые
, сохранить
, а накопить
.Как вы решаете, какой из них
использовать для конкретной проблемы?
Каждые
преобразовывают каждый элемент слова или предложения индивидуально. В
предложение результата обычно содержит столько же элементов, сколько
аргумент. [6]
Keep
выбирает определенные элементы слова или предложения и отбрасывает
другие. Элементы результата являются элементами аргумента, без
преобразование, но результат может быть меньше оригинала.
Accumulate
преобразует все слово или предложение в один результат
объединив тем или иным образом все элементы.
Эти три изображения графически отображают различия в значениях
из каждые
, сохраняют
, а накапливают
. На фотографиях мы
применяя эти процедуры высшего порядка к предложениям, но не забывайте, что
мы могли бы нарисовать аналогичные картинки, на которых процедуры более высокого порядка
обрабатывать буквы слова.
Вот еще один способ сравнить эти три функции высшего порядка:
функция | цель | первая аргумент – это … |
---|---|---|
каждые | преобразование | с одним аргументом преобразование функции |
сохранить | выбрать | с одним аргументом предикат функция |
накопить | сложить | двухаргументный объединение функции |
Чтобы помочь вам понять эти различия, мы рассмотрим конкретные примеры.
используя каждый из них, с каждым примером, за которым следует эквивалентное вычисление
выполняется без процедуры высшего порядка.Вот пример для каждые
:
> (каждая двойная девочка) (GG II RR LL) > (se (двойной 'g) (двойной 'я) (двойной 'r) (двойной 'l)) (GG II RR LL)
Вы можете, если хотите, придумать первое из этих выражений как сокращение второго.
Выражение, использующее keep
, также можно заменить выражением, которое
выполняет те же вычисления без использования Keep
. На этот раз это
немного грязнее:
> (четные? '(1 2 3 4 5)) (2 4) > (se (если (даже? 1) 1 '()) (если (даже? 2) 2 '()) (если (даже? 3) 3 '()) (если (даже? 4) 4 '()) (если (даже? 5) 5 '())) (2 4)
Вот как можно долго выразить накопление
:
> (накопить слово '(a c l u)) ACLU > (слово 'а (слово' с (слово 'л' и))) ACLU
(Конечно, слово
будет принимать любое количество аргументов, поэтому мы
мог бы вычислить тот же результат со всеми четырьмя буквами в качестве аргументов для
тот же призыв.Но версия, которую мы здесь показали, показывает, как накопить
реально работает; он объединяет элементы один за другим.)
Функции первого класса и приговоры первого класса
Если Scheme (или любой диалект Lisp) – ваш первый язык программирования,
наличие процедур, которые работают с целыми предложениями сразу, может показаться не таким
большое дело. Но если вы раньше программировали на каком-то менее сложном языке, вы
вероятно, вы привыкли писать что-то вроде первых букв
как цикл , в котором у вас есть переменная с именем I
, и вы выполняете некоторые
последовательность шагов для I = 1
, I = 2
и так далее, пока вы не дойдете до N
, количества элементов.Использование функций высшего порядка позволяет нам
выразить эту проблему сразу, а не в виде последовательности событий. Один раз
вы привыкли к образу мышления Lisp, вы можете сказать себе “просто
возьмите каждые первые
предложения “и это похоже на один шаг,
не сложная задача.
Два аспекта схемы объединяются, чтобы разрешить этот способ выражения. Один, о котором мы упоминали ранее, заключается в том, что предложения – это первоклассные данные. Вы можете использовать целое предложение в качестве аргумента процедуры.Вы можете ввести процитированное предложение в, или вы можете вычислить предложение, сложив слова вместе.
Второй момент – функции тоже первоклассные. Это позволяет нам писать
процедура типа pigl
, которая применяется к одному слову, а затем
объедините это с каждые
, чтобы перевести все предложение на Pig Latin.
Если бы у Scheme не было первоклассных функций, у нас не было бы универсальных
такие инструменты, как , сохраняют
и каждые
, потому что мы не можем сказать, какие
функция для распространения на все предложение.Позже вы увидите, что без через каждые
все еще можно было бы написать конкретный отправленный по запросу
и отдельно напишите процедуру первых букв
. Но
возможность использовать процедуру в качестве аргумента для другой процедуры позволяет нам обобщить идею «применить эту функцию к каждому слову
приговор.”
Повторно
Все функции высшего порядка, которые вы видели до сих пор, принимают функции как аргументы, но ни один из них не имеет функций в качестве возвращаемых значений.Это, у нас есть машины, которые могут загружать машины в свои загрузочные бункеры, но теперь мы хотели бы думать о машинах, которые выпадают других машин из их выпускные лотки – машинные заводы, так сказать.
В следующем примере процедура повторяется
возвращает процедуру:
> ((повторяется bf 3) '(она вошла через окно ванной)) (ЧЕРЕЗ ОКНО ВАННОЙ) > ((повторяется во множественном числе 4) 'компьютер) КОМПЬЮТЕРСССС > ((повторяющийся квадрат 2) 3) 81 год > (определить (отправлено дважды) (отправлено отправлено)) > ((повторяется двойная 3) '(банан)) (БАНАН БАНАН БАНАН БАНАН БАНАН БАНАН БАНАН БАНАН)Процедура
повторяется
принимает два аргумента, процедуру и число,
и возвращает новую процедуру.Возвращенная процедура вызывает
оригинальная процедура повторно. Например, (повторяется bf 3)
возвращает функцию, которая берет но в первую очередь, но в первую очередь из
но прежде всего аргумент.
Обратите внимание, что все наши примеры начинаются с двух открытых скобок. Если мы просто
вызвал , повторил
в приглашении схемы, мы вернем процедуру,
как это:> (повторяющийся квадрат 4) # <ПРОЦЕДУРА>Процедура, которую мы возвращаем, сама по себе не очень интересна, поэтому мы вызываем его так:
> ((повторяющийся квадрат 4) 2) 65536Чтобы понять это выражение, вы должны хорошенько подумать о его два подвыражения.Два подвыражения? Потому что есть два открытых скобки рядом друг с другом, можно было бы легко проигнорировать одну из них и поэтому думайте о выражении как о четырех атомарных подвыражениях. Но на самом деле их всего два. Первое подвыражение
(повторяющийся квадрат 4)
имеет в качестве значения процедуру. Второй
Подвыражение 2
имеет в качестве значения число. Ценность всего
Выражение происходит от применения процедуры к числу.
Все время мы говорили, что вы оцениваете составное выражение в двух
шаги: Сначала вы оцениваете все подвыражения.Затем вы применяете
от первого значения, которое должно быть процедурой, до остальных значений. Но
до сих пор первое подвыражение всегда состояло из одного слова,
название процедуры. Теперь мы видим, что первое выражение могло быть
вызов функции высшего порядка, как и любой аргумент
подвыражения могут быть вызовами функций.
Мы можем использовать , повторяющийся
, чтобы определить элемент
, который возвращает конкретный
элемент предложения:(определить (элемент n отправлен) (первый ((повторный bf (- n 1)) отправлен))) > (пункт 1 '(день из жизни)) А > (пункт 4 '(день из жизни)) THE
Подводные камни
Некоторые люди, кажется, влюбляются в каждые
и пытаются использовать его в
все проблемы, даже если держать
или накапливать
было бы больше
соответствующий.
Если вы обнаружите, что используете функцию предиката в качестве первого аргумента каждые
, вы почти наверняка собираетесь использовать , оставьте вместо него
. Для
Например, мы хотим написать процедуру, которая определяет, есть ли
слова в предложении аргумента являются числами:
(определить (любые числа? Отправлено) ;; неверно! (накапливать или (каждое число? отправлено)))
Это неверно по двум причинам. Во-первых, поскольку логические значения не являются словами, они не могут быть членами предложений:
> (предложение #T #F) ОШИБКА: АРГУМЕНТ ОТПРАВИТЬ НЕ СЛОВО ИЛИ ПРЕДЛОЖЕНИЕ: #F > (каждое число? '(a b 2 c 6)) ОШИБКА: АРГУМЕНТ ОТПРАВИТЬ НЕ СЛОВО ИЛИ ПРЕДЛОЖЕНИЕ: #T
Во-вторых, даже если бы у вас могло быть предложение, состоящее из логических значений, схема не позволяет
специальная форма, такая как или
, в качестве аргумента для более высокого порядка
функция.[7] В зависимости от вашей версии Scheme,
неправильные числа ?
может выдать сообщение об ошибке
любая из этих двух проблем.
Вместо того, чтобы использовать каждые
, выберите числа из аргумента и посчитайте
их:
(определить (любые числа? Отправлено) (нет (пусто? (оставить номер? отправлено))))
Функция keep
всегда возвращает результат одного и того же типа (т. Е.
слово или предложение) в качестве второго аргумента. Это имеет смысл, потому что если вы
выбрав подмножество слов предложения, вы хотите получить
приговор; но если вы выбираете подмножество букв слова, вы
хочу слово. С другой стороны, каждое значение
всегда возвращает предложение.
Вы можете подумать, что для каждые
было бы разумнее возвращать
слово, когда его вторым аргументом является слово. Иногда – это то, что вы
хочу, но иногда нет. Например:
(определить (по буквам цифра цифра) (элемент (+ 1 цифра) '(ноль один два три четыре пять шесть семь восемь девять))) > (каждая цифра заклинания 1971) (ОДИН ДЕВЯТЬ СЕМЬ ОДИН)
В тех случаях, когда вам действительно нужно слово, вы можете всего лишь накапливать слово
в предложении, которое возвращает каждые
.
Помните, что каждый
ожидает, что его первый аргумент будет функцией
всего один аргумент. Если вы вызываете каждые
с такой функцией, как частное
, которая ожидает два аргумента, вы получите сообщение об ошибке от частное
, жалуясь на то, что у него есть только один аргумент, и он хочет получить
два.
Некоторые люди пытаются обойти это, говоря такие вещи, как
(каждое (частное 6) '(1 2 3)) ;; неправильный!
Это своего рода принятие желаемого за действительное.Цель состоит в том, чтобы Схема
должен интерпретировать первый аргумент каждые
как заполнение пустого поля
шаблон, так что каждые
будут вычислять значения
(частное 6 1) (частное 6 2) (частное 6 3)
Но, конечно, Scheme делает то же самое, что всегда
делает: оценивает выражения аргументов, затем вызывает каждые
. Так
Схема попытается вычислить (частное 6)
и выдаст сообщение об ошибке.
Мы выбрали частное
для этого примера, потому что для этого требуется ровно два
аргументы.Многие примитивы схемы, которые обычно принимают два аргумента,
однако примет только один. Попытка принять желаемое за действительное с
одна из этих процедур по-прежнему неверна, но сообщение об ошибке другое.
Например, предположим, что вы пытаетесь добавить 3 к каждому из нескольких чисел следующим образом:
(каждые (+ 3) '(1 2 3)) ;; неправильный!
Первый аргумент каждые
в этом случае не является ”
процедура, которая добавляет 3 “, но результат, возвращаемый при вызове +
с
единственный аргумент 3
. (+ 3)
возвращает число 3
, которое
это не процедура. Таким образом, вы получите сообщение об ошибке типа «Попытка применить
непроцедура 3. ”
Идея этой ошибки – поиск способа “специализации” процедура с двумя аргументами, указав один из аргументов заранее, – это на самом деле хороший. В следующей главе мы представим новый механизм что позволяет такую специализацию.
Если процедура, которую вы используете в качестве аргумента для , каждые
возвращает пустой
предложение, то вы можете быть удивлены результатами:
(определить (номер битла n) (если (или (n 4)) '() (элемент n '(джон пол джордж ринго)))) > (битл-номер 3) ДЖОРДЖ > (битл-номер 5) () > (каждый битл-номер '(2 8 4 0 1)) (ПОЛ РИНГО ДЖОН)
Что случилось с 8
и 0
? Представьте, что из каждых
не существует, и вам пришлось проделать сложный путь:
(se (битл-номер 2) (битл-номер 8) (битл-номер 4) (номер-битл 0) (номер-битл 1))
Используя замену результата, мы получили бы
(se 'paul' () 'ringo' () 'john)
, что составляет всего (ПОЛ РИНГО ДЖОН)
.
С другой стороны, если каждая процедура аргумента
возвращает пустое слово , оно появится в результате.
> (каждый парень (ты мне нужен)) ("" EED OU)
Предложение, которое возвращает каждые
, состоит из трех слов:
пустое слово, eed
и ou
.
Не путайте
(первый '(один, два, три, четыре))
с
(каждый первый '(один, два, три, четыре))
В первом случае мы применяем процедуру сначала
к
приговор; во втором мы применяем первый
четыре раза,
к каждому из четырех слов отдельно.
Что произойдет, если в качестве аргумента использовать предложение из одного слова или слово из одной буквы
к накопить
? Он возвращает то слово или букву, даже не
вызывая данную процедуру. Это имеет смысл, если вы что-то используете
например +
или max
в качестве аккумулятора, но это сбивает с толку, что
(накопить se '(одно слово))
возвращает слова однослово
.
Что произойдет, если вы дадите набрать
пустым предложением или словом? Accumulate
принимает пустые аргументы для некоторых объединителей, но не для
другие:
> (накопить + '()) 0 > (накопить max '()) ОШИБКА: НЕВОЗМОЖНО НАКОПИТЬ ПУСТОЙ ВХОД С ЭТОМ КОМБИНЕРОМ
Комбайнеры, которые можно использовать с пустым предложением или словом: +
, *
, слово
и предложение
. Накопить
чеков
специально для одного из этих комбайнеров.
Почему этим четырем процедурам, а не другим, должно быть разрешено накапливать
пустых предложений или слов? Разница между ними и
другие комбайнеры заключаются в том, что вы можете вызывать их без аргументов, тогда как max
, например, требует хотя бы одного числа:
> (+) 0 > (макс.) ОШИБКА: НЕДОСТАТОЧНО АРГУМЕНТОВ К # <ПРОЦЕДУРА>.
Accumulate
фактически вызывает объединитель без аргументов
чтобы узнать, какое значение вернуть для пустого предложения или слова.Нам бы хотелось реализовать , чтобы накопить
, чтобы любой процедура, которая может быть вызвана без аргументов, будет принята как
комбайнер для накопления пустого предложения или слова. К сожалению, Scheme
не позволяет программе спросить: «Сколько аргументов будет
процедуру accept? “Лучшее, что мы могли сделать, это создать определенный набор
Комбайнеры с нулевым аргументом в порядке определения накапливают
.
Не думайте, что возвращаемое значение для пустого аргумента всегда равно нулю или пустой.
> (накопить * '()) 1
Такое поведение объясняется тем, что любая работающая функция
в этом случае без аргументов возвращает свой идентификационный элемент .
Что такое элемент идентичности? Функция +
имеет тождественный элемент 0
, потому что (+
ничего, 0)
возвращает что угодно. Точно так же пустое слово является элементом идентичности для слова
. В общем, элемент идентичности функции обладает тем свойством, что когда
вы вызываете функцию с элементом идентичности и чем-то еще как
аргументы, возвращаемое значение – что-то еще.Это соглашение о схеме
что процедура с элементом идентичности возвращает этот элемент при вызове
без аргументов. [8]
Использование двух последовательных открытых круглых скобок для вызова процедуры Процедура возвращает странное обозначение:
((повторный бф 3) 987654)
Не путайте это с похожей нотацией cond
,
в котором внешние круглые скобки имеют особое значение (ограничивая предложение cond
). Здесь круглые скобки имеют обычное значение.Внутренний
круглые скобки вызывают процедуру , повторенную
с аргументами bf
и 3
. Значение этого выражения – процедура. У него нет
name, но для целей этого абзаца представим, что оно называется bfthree
. Тогда внешние скобки в основном говорят (bfthree 987654)
; они применяют неназванную процедуру к аргументу 987654
.
Другими словами, есть два набора круглых скобок, потому что есть два набора
вызываемые функции: повторяется
и функция, возвращаемая повторил
.Так что не говори
(повторный bf 3 987654) ;; неправильный
просто потому, что он выглядит более знакомым. Повторяется
не является
функция трех аргументов.
Расточные упражнения
8.1 Что возвращает Scheme в качестве значения каждого из следующих выражений? Убедитесь в этом сами, прежде чем попробовать на компьютере.
> (каждый последний '(алгебра пурпурный спагетти томатный гну)) > (сохранить номер? '(раз, два, три, четыре)) > (накопить * '(6 7 13 0 9 42 17)) > (член? 'h (держать гласную?' (t h r o a t))) > (каждый квадрат (оставить четным? '(87 4 7 12 0 5))) > (накапливать слово (держать гласную? (каждое первое '(а я ее люблю)))) > ((повторяющийся квадрат 0) 25) > (каждый (повторяется бл 2) '(добрый день, солнышко))
8.2 Заполните пропуски в следующей схеме взаимодействий:
> (______ гласная? 'День рождения) Я > (______ первый '(золотые дремоты)) (G S) > (______ '(золотые дремоты)) ЗОЛОТОЙ > (______ ______ '(дитя)) (E D) > (______ ______ (______ ______ '(дитя))) ED > (______ + '(2 3 4 5)) (2 3 4 5) > (______ + '(2 3 4 5)) 14
8,3 Опишите каждую из следующих функций на английском языке. Обязательно укажите описание области и диапазона каждой функции.Будьте так же точны, как возможный; например, “аргумент должен быть функцией одного числового аргумент “лучше, чем” аргумент должен быть функцией “.
(определить (f a) (держать даже? а)) (определить (g b) (каждый б '(путь голубой сойки)))
(определить (h c d) (c (c d))) (определите (i e) (/ (накопить + e) (подсчитать e))) накапливать sqrt повторяется (повторяется sqrt 3) (повторяется даже? 2) (повторяется первые 2) (повторяется (повторяется bf 3) 2)
Реальные упражнения
Примечание: написание вспомогательных процедур может оказаться полезным при решении некоторых из этих проблем. проблемы. Если вы читали часть IV до этого, не используйте рекурсию в решении этих проблем; вместо этого используйте функции высшего порядка.
8,4 Напишите процедуру choose-beatles
, которая принимает предикат
функция в качестве аргумента и возвращает предложение только тех Битлз (Джон,
Пол, Джордж и Ринго), удовлетворяющие сказуемому. Например:
(определить (конечная гласная? Wd) (гласная? (Последний wd))) (определить (четное число? wd) (четное? (счет wd))) > (выбрать-битлз концы-гласные?) (ДЖОРДЖ РИНГО) > (выбрать-битлз даже-посчитать?) (ДЖОН ПОЛ ДЖОРДЖ)
8.5 Напишите процедуру transform-beatles
, которая принимает процедуру как
аргумент, применяет его к каждому из Beatles и возвращает результаты в виде
приговор:
(определить (удивить имя) (слово "удивительное-имя"))
> (трансформировать-битлз удивлять) (УДИВИТЕЛЬНЫЙ-ИОАНН УДИВИТЕЛЬНЫЙ-ПОЛ УДИВИТЕЛЬНЫЙ-ДЖОРДЖ. УДИВИТЕЛЬНОЕ РИНГО) > (трансформируй-битлз, но сначала) (ОН АУЛ ЭОРГЕ ИНГО)
8,6 Когда вы разговариваете с кем-то по шумной радиосвязи, вы иногда нужно произносить слово по буквам, чтобы другой человек его понял.Но и названия букв понять не так-то просто, так что есть стандартный код, в котором каждая буква представлена определенным словом, которое начинается с буквы. Например, вместо «Б» вы говорите «браво».
Напишите процедуру слов
, которая принимает слово в качестве аргумента и
возвращает предложение названий букв в слове:
> (слова "кабина") (ЧАРЛИ АЛЬФА БРАВО)
(Вы можете придумать свои собственные имена для букв или найти стандартные, если хотите.)
Подсказка: начните с написания вспомогательной процедуры, которая определяет имя для одна буква.
8,7 [14,5] [9]
Напишите процедуру подсчета букв
, которая принимает предложение как свое
аргумент и возвращает общее количество букв в предложении:
> (количество букв '(исправление отверстия)) 11
8,8 [12,5]
Напишите процедуру преувеличения
, которая преувеличивает предложения:
> (преувеличиваю (я съел 3 потстикера)) (Я ЕСТЬ 6 НАКЛЕЙКОВ) > (преувеличить '(здесь хорошо поесть чау-чау)) (ЗДЕСЬ БОЛЬШОЙ ЧАУ ВЕСЕЛЬЕ)
Он должен удвоить все числа в предложении и заменить “хорошо” с “отличным”, “плохо” с “ужасным” и все остальное, что вы можно придумать.
8,9 Какую процедуру вы можете использовать в качестве первого аргумента для каждые
, чтобы для
любое предложение, используемое в качестве второго аргумента, , каждое
возвращает это предложение?
Какую процедуру вы можете использовать в качестве первого аргумента для , оставьте
, чтобы для
любое предложение, используемое в качестве второго аргумента, сохранить
вернет это предложение?
Какую процедуру вы можете использовать в качестве первого аргумента для , чтобы накопить
, чтобы
для любого предложения, используемого в качестве второго аргумента, накопить
вернет это
приговор?
8.10 Записать предикат , верный для всех?
, который принимает два аргумента, a
сказуемая процедура и предложение. Он должен вернуть #t
, если
Аргумент предиката возвращает истину для каждые слова в предложении.
> (верно для всех? Даже? '(2 4 6 8)) #T > (Верно для всех? даже? '(2 6 3 4)) #F
8,11 [12,6] Напишите процедуру GPA. В качестве аргумента следует использовать предложение с оценками. и вернуть соответствующий средний балл:
> (гпа '(A A + B + B)) 3.67
Подсказка: напишите вспомогательную процедуру базового уровня
, которая требует
оценка в качестве аргумента и возвращает 0, 1, 2, 3 или 4, а также другой помощник
процедура модификатор класса
, которая возвращает -,33, 0 или 0,33, в зависимости от
есть ли у оценки минус, плюс или нет.
8,12 [11,2]
Когда вы ведете класс, люди отвлекутся, если вы скажете “ммм” слишком много.
раз. Напишите count-ums
, которое считает, сколько раз “um”
появляется в предложении:
> (count-ums '(сегодня мы собираемся поговорить о функциональном программировании)) 3
8.13 [11,3]
Напишите процедуру phone-unspell
, которая использует версию
номер телефона, например POPCORN
, и возвращает реальный номер телефона в
этот случай 7672676
. Вам нужно будет написать вспомогательную процедуру, которая
использует 8-стороннее выражение cond
для перевода одной буквы в
цифра.
8,14 Напишите процедуру подслова
, которая принимает три аргумента:
слово, номер начальной позиции и номер конечной позиции.Должно
вернуть подслово, содержащее только буквы между указанными
должности:
> (подслово полиэтилен 5 8) ТОГДА
[1] Как и все процедуры в этой книге, касающиеся слов и предложения,
каждые
и другие процедуры в этой главе
являются частью наших расширений Scheme. Позже, в главе 17, мы
ввести стандартные эквиваленты схемы. [2] Если говорить о на каждые
, наши
решите отличать функции от процедур, которые их реализуют.Является ли аргумент каждые
функцией или процедурой? Если мы подумаем о каждый
как процедуру – то есть, если мы сосредоточимся на том, как это
выполняет свою работу – тогда, конечно, мы должны сказать, что она выполняет свою работу, многократно
вызывая процедуру , которую мы указываем в качестве аргумента. Но это
одинаково справедливо для нас сосредоточить внимание на функции, которую каждые
процедура реализует, и эта функция принимает функции как
аргументы.
[3] Вы можете столкнуться с математической проблемой, если попытаетесь определить функция, домен которой включает всех функций, потому что применение таких функция сама по себе может привести к парадоксу.В программировании соответствующая опасность состоит в том, что применение процедуры более высокого порядка к самому может привести к программе, которая будет выполняться вечно.
[4] Некоторые рецепты могут включать другие рецепты, потому что они говорят что-то вроде «добавить песто» (рецепт на стр. 12) ». Но это всего лишь композиция функций; результат процедуры песто используется в качестве аргумента этого рецепта. В Сам по себе рецепт песто не является ингредиентом.
[5] Мы имеем в виду, конечно, “Мы будем вызывать каждые
с
процедура всегда - один
и наше предложение аргумента в качестве двух его аргументов.”
После того, как вы какое-то время занимались программированием компьютеров, такое злоупотребление
Английский язык придет к вам естественным образом.
[6] Под “обычно” мы подразумеваем, что на каждые
часто используется с функцией аргумента, которая возвращает одно слово. Если
функция возвращает предложение, длина которого может отличаться от единицы, тогда число
слов в общем результате могло быть что угодно!
[7] Как мы говорили в главе 4, специальные формы не процедуры, и не являются первоклассными.
[8] PC Scheme возвращает ноль для вызова max
без аргументов, но это неправильный ответ.Во всяком случае,
ответ должен быть −∞.
[9] В упражнении 14.5 части IV вам предлагается решить эту проблему. та же проблема с использованием рекурсии. Здесь мы просим вас использовать функции высшего порядка. Когда мы ставим одну и ту же проблему в обеих частях, мы сделайте перекрестные ссылки в скобках, как мы сделали здесь. Когда вы видите проблему во второй раз вы можете обратиться к своему первому решению за идеями.
(вернуться к содержанию)
НАЗАД резьба главы СЛЕДУЮЩАЯ
Брайан Харви, bh @ cs.berkeley.edu
Язык программирования и расширений GNU – GNU Guile
Guile – это язык программирования
Guile разработан, чтобы помочь программистам создавать гибкие приложения, которые могут быть расширены пользователями или другими программистами с помощью подключаемых модулей, модулей или сценариев.
С помощью Guile вы можете создавать приложения и игры для настольных компьютеров, Интернета, командной строки и т. Д.
Загрузить Начать работу
Примеры кода
Guile – это реализация языка программирования Scheme, поддерживающая Revised 5 и большинство отчетов Revised 6 , а также многие SRFI.Он также поставляется с библиотекой модулей, которые предлагают дополнительные функции, такие как HTTP-сервер и клиент, синтаксический анализ XML и объектно-ориентированное программирование.
(определите название "Мир") (display (строка-добавление "Hello" name "!")) (новая строка)
Программа Hello world
Определите переменную с именем name
, соедините тексты Hello
, name
и !
вместе, чтобы сформировать приветствие Привет, мир!
, и отобразить его на экране.
(использование модулей (srfi srfi-19)) (отображение (дата-> строка (текущая дата) "~ A, ~ B ~ e ~ Y ~ H: ~ S")) (новая строка)
Импорт модулей
Импортируйте модуль srfi-19 и используйте его функции для отображения текущей даты и времени в формате WEEKDAY, MONTH MONTHDAY YEAR HOUR: SECOND.
(использование модулей (веб-сервер)) (определить (тело запроса моего обработчика) (значения '((тип-содержимого. (текст / простой))) "Привет мир!")) (run-server my-handler)
Hello HTTP server
Запустите веб-сервер, который вернет ответ с текстом «Hello World!» на каждый запрос, отправленный HTTP-клиентами. Откройте http: // localhost: 8080 /, чтобы увидеть результат.
Guile – это платформа языка расширения
Guile содержит эффективный компилятор и виртуальную машину.Его можно сразу использовать для написания программ на Scheme или легко интегрировать с программами C и C ++.
Guile – это универсальный интеллектуальный язык GNU для расширений и официальный язык расширений проекта GNU.
Расширение приложений
Помимо Scheme, Guile включает интерфейсы компилятора для ECMAScript и Emacs Lisp (в настоящее время поддерживается Lua), что означает, что ваше приложение может быть расширено на языке (или языках), наиболее подходящем для вашей пользовательской базы.