ВУЗ:
Составители:
Рубрика:
13
2. Генераторы
Генераторами называются операторы (и выражения), произ-
водящие множество значений в контексте генерации. Чтобы по-
нять, как работают генераторы, следует иметь в виду:
во-первых, общую для всех языков основную последова-
тельность выполнения выражений – слева направо и сверху вниз с
учетом приоритета операторов;
во-вторых, возврат назад для того, чтобы найти
подвыраже-
ние, генерирующее более одного значения, взять новое значение и
повторить процесс.
Этот возврат с перебором называется бэктрекингом. Прото-
типами бэктрекинга являются различные конструкции, органи-
зующие циклы. Бэктрекинг – «главный кит» Пролога, наряду с
подстановкой и унификацией. Он использует его, как нечто само
собой разумеющееся. Например, человек, знакомый только с Си,
не
сможет понять, что предикат p:
p:-fact1(_,_,X,_),fact2(_,Y,_), X<Y,!,...
переберет все экземпляры фактов fact1, fact2, чтобы найти
первую их комбинацию, удовлетворяющую условию X<Y. В
Icon'е контекст перебора почти всегда должен быть указан явно,
т. е. одного оператора, имеющего статус генератора, недостаточ-
но. Например:
f:=open("myfile.txt,"rt")
..........................
S:=!f # читается одна запись файла
Но выражение every(write(!f)) выведет построчно на экран
все записи (несколько
ниже приведен пример кода в чисто «про-
логовском» стиле).
2.1. Every, to, every do
every создает контекст, в котором может быть сгенерирова-
но множество значений. В нижеследующем примере каждое вы-
ражение в последовательности, за исключением последнего, гене-
рирует не более одного значения. Последнее выражение генериру-
ет столько значений, сколько позволяет контекст.
14
Оператор to может генерировать серию значений. Напри-
мер, в случае 100 to 103 мог бы сгенерировать значения 100, 101,
102, 103, если ему это позволят.
В случае write(10 to 20) печатается единственное значение
10.
Но every write(1 to 3) напечатает 123.
Вариант to by очевиден, by задает шаг.
Примеры:
every i:=1 to 100 by 10 do write(i)
Выход: 1
11
21
....
91
every {writes(" ",1 to 5); writes(" ",6 to 10)}
Выход: 1 6 7 8 9 10
Но
every (writes(" ",1 to 5), writes(" ",6 to 10))
дает на выходе:
1 6 7 8 9 10 2 6 7 8 9 10 3 6 7 8 9 10 4 6 7 8 9 10 5 6 7 8 9 10
В данном случае (every (e1,e2)):
1. После генерации первого из возможных значений выра-
жения e1
управление передается выражению e2.
2. e2 генерирует все возможные значения.
3. Затем e1 генерирует следующее значение и т. д.
e1 и e2 могут быть успешными и неуспешными.
every i:=1 to 5 do writes(" ",i)
S:=4
every S<4 do writes(" ",17 to 18)
Выход: нет выхода.
Если же мы напишем every S<4, то будет напечатано число
17.
2. Генераторы Оператор to может генерировать серию значений. Напри- мер, в случае 100 to 103 мог бы сгенерировать значения 100, 101, Генераторами называются операторы (и выражения), произ- 102, 103, если ему это позволят. водящие множество значений в контексте генерации. Чтобы по- В случае write(10 to 20) печатается единственное значение нять, как работают генераторы, следует иметь в виду: 10. во-первых, общую для всех языков основную последова- Но every write(1 to 3) напечатает 123. тельность выполнения выражений – слева направо и сверху вниз с Вариант to by очевиден, by задает шаг. учетом приоритета операторов; Примеры: во-вторых, возврат назад для того, чтобы найти подвыраже- every i:=1 to 100 by 10 do write(i) ние, генерирующее более одного значения, взять новое значение и Выход: 1 повторить процесс. 11 Этот возврат с перебором называется бэктрекингом. Прото- 21 типами бэктрекинга являются различные конструкции, органи- .... зующие циклы. Бэктрекинг – «главный кит» Пролога, наряду с 91 подстановкой и унификацией. Он использует его, как нечто само every {writes(" ",1 to 5); writes(" ",6 to 10)} собой разумеющееся. Например, человек, знакомый только с Си, Выход: 1 6 7 8 9 10 не сможет понять, что предикат p: Но every (writes(" ",1 to 5), writes(" ",6 to 10)) p:-fact1(_,_,X,_),fact2(_,Y,_), X
Страницы
- « первая
- ‹ предыдущая
- …
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »