Скачиваний:
52
Добавлен:
01.05.2014
Размер:
346.11 Кб
Скачать

12.6. Дополнительные сведения

Ввод-вывод никогда по-настоящему не гармонировал с остальной частью языка Пролог. Обычная реализация ввода-вывода с побочными эффектами полагается исключительно на процедурную семантику Пролога и никак не связана с исходной моделью логического программирования. Например, если оператор вывода появляется на безуспешной ветви вычислений, то возврат не способен исправить выведенные данные. Считанный входной терм теряется при возврате, так как входной поток не допускает возвратов.

В параллельных языках логического программирования предприняты попытки решить данную проблему и добиться более гармоничного совмещения ввода-вывода с моделью логического программирования. Это делается путем отождествления входных-выходных потоков внешних устройств с логическими потоками в языке (Shapiro, 1984). Бесконечные рекурсивные процессы способны возрастающе производить или потреблять такие потен­циально неограниченные потоки.

Самомодифицируемые программы представляют собой устаревшую концепцию про­граммирования. Современные языки программирования исключают возможность построения таких программ и даже в разумном программировании на ассемблере избегают подобныхпрограммистских трюков. Ирония судьбы состоит в том, что язык, пытающийся открыть новую эру в программировании, открыл ворота архаическим методам, использующим предикаты assert и retract.

Эти предикаты обработки программ первоначально были введены в качестве средств нижнего уровня для загрузки и перезагрузки программ и реализованы в Прологе-10 с помощью предикатов consult и reconsutl. Однако, как и в случаях других конструкций языка, они в конце концов стали применяться при решении таких задач, для которых, как мы полагаем, первоначально не были предназначены.

В современных реализациях Пролога пытаются возместить некоторый ущерб за счет введения альтернативных конструкций, таких, как slot в ESP (Chikayama, 1984), или специальных объявлений изменяемых предикатов, как в Quintus-Прологе (Quintus, 1985).

В параллельных языках логического программирования можно полностью отказаться (и отказываются) от подобных конструкций (Silvermanetal., 1986), так как в таких языках глобальные, модифицируемые структуры данных могут быть реализованы с помощью мониторов, имеющих чисто логическое определение, как, например, бесконечный рекурсивный процесс (Shapiro, 1984).

В Edinburgh-Прологе имеются два системных предиката для ввода литер -getO(X) и get(X). Различие между ними заключается в том, что getO(X) возвращает следующую литеру. в то время как get(X) получает следующую печатаемую литеру, т.е. такую, чей код ASCII больше 32. Необходим только один, более общий оператор, который мы называем get, а не getO.

С программой, решающей задачу о ханойской башне, нас познакомил Шмуль Сафра (Shmuel Safra).

Редактор строк взят из работы (Warren, 19820).

Соседние файлы в папке 1-13