Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Ошибки/опечатки в учебнике "Современное логическое программирование на языке VIP 7.5"
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию Ошибки/опечатки в учебнике "Современное логическое программирование на языке VIP 7.5" - 01.12.2015, 11:42

В этой теме писать только найденные ошибки и опечатки.
Вопросы задавать в других темах.
Это просьба
Тема подвешена вверху. Если долго не будет сообщений, то я статус "Важная" сниму с этой темы.

Замеченные ошибки/опечатки и их исправления:
  1. Стр.30. Первый абзац раздела 2.3. Написано: "Список есть специальный вид двоичного безфункторного рекурсивного терма...". Следует читать: "Список есть специальный вид двухарного безфункторного рекурсивного терма...".
  2. Стр.35. Табл.2.3 Строка 10. Написано: "Y=8". Следует читать: "Z=45"
  3. Стр.36. Предпоследняя строка. Написано: "связанных переменные". Следует читать: "связанные переменные".
  4. Стр.38. Последняя строка таблицы. Написано: "неравно". Следует читать: "не равно".
  5. Стр.46. Второе предложение сверху. Написано: "...но он не будет его подтипом...". Следует читать: "...он не будет его подтипом...".
  6. Стр.63. Второй абзац снизу. Написано: "Другой пример — определение принадлежности переменной X заданному диапазону, например: 0<X<12:". Следует читать: "Другой пример — определение принадлежности переменной X заданному диапазону, например: 0<=X<=12:".
  7. Стр.79. Первый абзац, первая строка. Написано: "Рассмотрим предикат pr/2, ...". Следует читать: "Рассмотрим предикат p/2, ...".
  8. Стр.118. Последний абзац. Написано: "Требуется найти все те точки, которые лежат выше горизонтальной прямой Y=3 и правее вертикальной прямой X=7". Следует читать: "Требуется найти все те точки, которые лежат выше горизонтальной прямой Y=3 или правее вертикальной прямой X=7".
  9. Стр.135. Текст программы вверху страницы является повтором программы из предыдущего примера 11.4. Этот текст программы не читать.
  10. Стр.172. Третий абзац сверху. Написано: "Свойство p(X) в коллекторе списков должно быть недетерминированным. Его роль могут выполнять предикаты и факты.". Следует читать: "Свойство Р(X) может иметь любой режим детерминизма. Его роль могут выполнять предикаты и/или факты. Однако в случае, когда это свойство описывается предикатами с режимами детерминизма procedure, determ, erroneus или фактами с режимами детерминизма single, determ нет никакого смысла в использовании коллектора списка, так как собирать нечего. Список при указанных режимах будет либо пустым, либо содержать один элемент. Самый распространённый режим детерминизма предикатов и фактов в коллекторе списка это nondeterm и/или multi.".
  11. Стр.248. Второй пункт списка в параграфе 21.1.2. Написано: "Потоку можно назначить максимальное время выполнения, по истечении которого поток будет прерван, если только до этого срока он не завершится самостоятельно. Для завершения потока по таймеру служит функция:
    EventCode = Object:wait(Milliseconds)".
    Следует читать: "Для определения момента завершения потока в течение заданного интервала времени служит функция:
    EventCode = Object:wait(Milliseconds)
    Время ожидания завершения задаётся в миллисекундах. Если поток в течении этого времени успешно завершится, то функция wait/1 вернёт wait_object_0 = 0, иначе вернёт wait_timeout = 0x00000102.".
  12. Стр.248 Третий пункт списка в параграфе 21.1.2. Написано: "Для принудительного завершения потока служит предикат:
    Object:terminate(ExitCode)
    Значение ExitCode задает программист для того, чтобы определить причину принудительного завершения.".
    Следует читать: "Для принудительного завершения "зависшего" потока служит предикат:
    Object:terminate(ExitCode)
    Этот предикат применяется только в случае, когда поток завис! Значение ExitCode задает программист для того, чтобы определить причину принудительного завершения.".
  13. Стр.249 Первый абзац следует дополнить предостережением: "Предикаты suspend и resume надо использовать крайне осторожно. Не допускается их использовать для синхронизации активных потоков, так как нет никакой возможности узнать какой именно код выполнялся потоком когда тот был приостановлен.".
  14. Стр. 291, последняя строка. Написано: "дер(лист,3,Прав) замещается его потомком - правым поддеревом Прав".
    Следует читать: "дер(Лев,9,лист) замещается его потомком - левым поддеревом Лев"

Последний раз редактировалось Винитарх; 13.01.2017 в 00:55
Ответить с цитированием
  (#2 (permalink)) Старый
MosAic MosAic вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2015
По умолчанию 01.12.2015, 11:53

Посмотрите пожалуйста:
Стр. 35 табл. 2.3 строка 10. Мне кажется нужно заменить Y=8 на Z=45
Стр. 36 предпоследняя строка. "связанных переменные"

Это очепятки. А следует ли предлагать изменения в определениях?
Ответить с цитированием
  (#3 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 01.12.2015, 12:02

Цитата:
Сообщение от MosAic Посмотреть сообщение
Стр. 35 табл. 2.3 строка 10. Мне кажется нужно заменить Y=8 на Z=45
Да. Спасибо. Я всегда говорю, что большинство ошибок из-за копи-пасты. Так и здесь.
Цитата:
Сообщение от MosAic Посмотреть сообщение
Стр. 36 предпоследняя строка. "связанных переменные"
Угу. Надо исправить на "связанные переменные".
Цитата:
Сообщение от MosAic Посмотреть сообщение
А следует ли предлагать изменения в определениях?
По желанию. Хотите - предлагайте. Покумекаем. Я не претендую на абсолютность и правильность определений.
Ответить с цитированием
  (#4 (permalink)) Старый
MosAic MosAic вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2015
По умолчанию 01.12.2015, 12:30

Например стр. 30, первый абзац. Определение основного и неосновного термов. Тут конечно не так просто сформулировать, но основная мысль такая - если в терм не входят свободные переменные, то это еще не значит, что в него не входят неосновные термы и поэтому в определении основного терма это должно быть отмечено. А то получается, что в определении написано только о переменных, а в примере во втором абзаце говорится "поскольку один из его аргументов - неосновной терм". Ну я понял конечно о чем речь. Просто хочется строгости что-ли... Определение наверное получится рекурсивным. Но с ходу я не смог сформулировать красиво человеческим языком. Не увидел ниточку, за которую можно размотать клубок.
Ответить с цитированием
  (#5 (permalink)) Старый
MosAic MosAic вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2015
По умолчанию 01.12.2015, 12:46

Ну и еще одна придирка, извините, в том же ключе. Там же на стр. 30. Первый абзац раздела 2.3. "Список есть специальный вид двоичного безфункторного рекурсивного терма..." Почему "двоичного", если на стр. 28 написано, что называть можно N-арным или N-местным? Споткнулся на этом месте секунд на 30, выстраивая цепочку 2-арный - бинарный - двоичный. Ну если еще как-то принято называть арность, так лучше сразу предупредить на стр. 28

Если вам это покажется занудством, то только скажите. Я поставлю фильтр на такие мелочи.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 01.12.2015, 13:57

Страница 30, первый абзац:
Цитата:
Термы, в которые не входят свободные переменные, называются основными.
Честно говоря, я здесь не вижу недосказанности. Если в терм не входит свободная переменная, то, как я понимаю, это означает, что она не входит ни в один аргумент этого терма, независимо от того, как синтаксически выражен аргумент. Переменная - ведь это тоже терм.
Цитата:
Сообщение от MosAic Посмотреть сообщение
Первый абзац раздела 2.3. "Список есть специальный вид двоичного безфункторного рекурсивного терма..." Почему "двоичного", если на стр. 28 написано, что называть можно N-арным или N-местным?
Да, согласен. Спасибо. Здесь надо исправить так: "Список есть специальный вид двухарного безфункторного рекурсивного терма..."
Цитата:
Сообщение от MosAic Посмотреть сообщение
Если вам это покажется занудством, то только скажите. Я поставлю фильтр на такие мелочи.
В такой ситуации это не занудство.

MosAic, если Вас интересует точность определений, то это Вам по каким-то причинам важно? Это Вам надо по работе?
Ответить с цитированием
  (#7 (permalink)) Старый
MosAic MosAic вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.12.2015
По умолчанию 01.12.2015, 15:10

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Честно говоря, я здесь не вижу недосказанности. Если в терм не входит свободная переменная, то, как я понимаю, это означает, что она не входит ни в один аргумент этого терма, независимо от того, как синтаксически выражен аргумент. Переменная - ведь это тоже терм.
Это полностью на ваше усмотрение. Просто воспринял это как описал, а по делу ли у меня возник вопрос судить вам т. к. абсолютный нуб в этой теме. Ну может чуть-чуть интересовался. Здесь и кроется ответ на ваш вопрос:

Цитата:
Сообщение от Винитарх Посмотреть сообщение
MosAic, если Вас интересует точность определений, то это Вам по каким-то причинам важно? Это Вам надо по работе?
Поскольку я абсолютный новичок в Прологе, то всякая ситуация, когда используется не определенный ранее термин или есть двусмысленность в определении, "бросается в глаза". Вернее, "не укладывается в голове". Читаю очень вдумчиво, часто заглядываю на несколько страниц назад, контролирую свое понимание на примерах - строю в голове стройную систему, пытаюсь понять идеологию языка. Ваш подход мне очень нравится, все очень обстоятельно и по порядку, по накатанной. Просто поделился с вами где "споткнулся", как на стыке рельсов. Человек, который уже знает все эти термины, почти наверняка, никакого дискомфорта не почувствует.

Ну и "чтобы два раза не вставать" - Пролог изучаю для себя, с надеждой применить на практике. Нужно понять его возможности и сравнить саму парадигму с Рефалом. Это пока никак не связано с работой. Занимаюсь когда появляется время.
Ответить с цитированием
  (#8 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 01.12.2015, 23:35

Цитата:
Сообщение от MosAic Посмотреть сообщение
Просто поделился с вами где "споткнулся", как на стыке рельсов.
Очень хорошо, что Вы замечаете "стыки рельсов".
У меня, да у многих постоянных участников форума глаз на такие стыки уже "замылился", и зачастую не воспринимает очевидных ляпов.
Цитата:
Сообщение от MosAic Посмотреть сообщение
Нужно понять его возможности и сравнить саму парадигму с Рефалом.
Рефал это очень хороший функциональный язык. Обработка строк и других последовательностей на нём - просто конфетка. Списки - двусвязные! Да и сам язык патриотичный.
Ответить с цитированием
  (#9 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 466
Сказал(а) спасибо: 17
Поблагодарили 31 раз(а) в 31 сообщениях
Регистрация: 28.03.2012
По умолчанию 06.12.2015, 12:20

начал с середины.
  • 21.1.2 -2 предикат wait/1-> не останавливает поток через заданное время! а, как и wait/0-> ждет завершение, но не бесконечно, а заданный интервал
  • 21.1.3 suspend/resume - надо использовать крайне осторожно! Вот что написано в MSDN:
    Цитата:
    Do not use the Suspend and Resume methods to synchronize the activities of threads. You have no way of knowing what code a thread is executing when you suspend it.
  • 21.1.2 terminate - аналогично suspend/resume И даже хуже. Только когда поток "завис"
  • 21.2 последний абзай (перед 21.3) - порядок все равно не определён! Даже если поток стартует первым, это ничего не значит. В данном случае
  • 21.1.4 хороший способ передачи данных потоку - создать свой интерфейс с наследованием. Например так:
    prolog Код:
    interface myThread : thread
    и тогда все файты попадаю в ваше распоряжение автоматом.
  • 22.2 не описано (а оно кажется немного отличается) для 64 битного режима
Ответить с цитированием
  (#10 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 06.12.2015, 13:47

Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
21.1.2 -2 предикат wait/1-> не останавливает поток через заданное время! а, как и wait/0-> ждет завершение, но не бесконечно, а заданный интервал
Если через заданное время поток не завершился, то что тогда? Вернёт EventCode неравный нулю?
Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
21.1.3 suspend/resume - надо использовать крайне осторожно! Вот что написано в MSDN:
Цитата:
Do not use the Suspend and Resume methods to synchronize the activities of threads. You have no way of knowing what code a thread is executing when you suspend it.
21.1.2 terminate - аналогично suspend/resume И даже хуже. Только когда поток "завис"
Ага. Учтём. suspend/resume в простых примерах работают вроде нормально. А terminate я не использовал.
Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
21.2 последний абзай (перед 21.3) - порядок все равно не определён! Даже если поток стартует первым, это ничего не значит. В данном случае
Да. Порядок запуска потоков не определён. Но смысл примера в другом - вывод на экран (разделяемый ресурс) информации из двух потоков с помощью мониторного класса. Если один поток начал выводить информацию на экран, то второй поток не вклинится в это дело до тех пор, пока первый поток не освободит разделяемый ресурс.
Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
21.1.4 хороший способ передачи данных потоку - создать свой интерфейс с наследованием. Например так:
prolog Код:
interface myThread : thread
и тогда все файлы попадаю в ваше распоряжение автоматом.
Не пробовал и даже не думал об этом. Спасибо.
Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
22.2 не описано (а оно кажется немного отличается) для 64 битного режима
Да. Не описано. Когда я писал главу 22, то у меня ещё стояла Windows XP-32. Потом я установил Win-7-64 (максимальная), но возвращаться к уже написанным главам не стал. Реально я писал книгу 2,5 года, не спеша, не волнуясь, медленно. Писал на и для VIP7.4. И когда всё было готово для передачи файлов в издательство вышла версия 7.5. Пришлось срочно-обморочно всё перепроверять. С консольками проблем не было. Жуткие изменения были с GUI-проектами, так как Томас по моей просьбе сделал SDI-проекты доступными в персональной версии, но вставил в SDI-форму ленту(ribbon), и это сломало все мои GUI-проекты. Их пришлось оставить теми же (время поджимало), но показать как удалить из формы эту ленту, все обработчики событий от этой ленты в исходнике, удалить по-моему статус-строку из SDI-проекта и ещё там что-то, уже не помню. Короче, Томас "удружил" - сделал хорошо, но так внезапно, что вызвало у меня шок.

Спасибо за замечания. Вы взялись за те главы, которые я считаю самыми тонкими звеньями
Ответить с цитированием
  (#11 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 466
Сказал(а) спасибо: 17
Поблагодарили 31 раз(а) в 31 сообщениях
Регистрация: 28.03.2012
По умолчанию 06.12.2015, 13:58

Цитата:
Сообщение от Винитарх Посмотреть сообщение
и тогда все файлы попадаю в ваше распоряжение автоматом.
опечатка, не файлы или файты, а факты

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Вернёт EventCode неравный нулю?
если дождется (за данный интервал времени, то вернется не ноль, а wait_object_0, которая равно 0

Если за отведённое время поток не закончится, то wait_timeout = 0x00000102. Могут быть и другие коды, но реагировать достаточно на эти

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Вы взялись за те главы, которые я считаю самыми тонкими звеньями
Ответить с цитированием
  (#12 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 06.12.2015, 16:36

Резюмируем wait(Время):
если поток в течении этого Время успешно завершится, то функция wait/1 вернёт wait_object_0 = 0, иначе вернёт wait_timeout = 0x00000102.
Спасибо.

Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
опечатка, не файлы или файты, а факты
Да, конечно.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 466
Сказал(а) спасибо: 17
Поблагодарили 31 раз(а) в 31 сообщениях
Регистрация: 28.03.2012
По умолчанию 06.12.2015, 17:01

Цитата:
Сообщение от Винитарх Посмотреть сообщение
если поток в течении этого Время успешно завершится, то функция wait/1 вернёт wait_object_0 = 0, иначе вернёт wait_timeout = 0x00000102.
именно так.
  • 13.9
    Цитата:
    свойство P должно быть недетерминированным.
    На самом деле нет (multi не написано, как я понимаю, для ясности). Следующие конструкции правильные.
    prolog Код:
    [0] = [ 0 || succeed ],
     [] = [ 1 || fail ],
    правда на 1 будет предупреждение компилятора, что терм 1 не достигается. Конечно, если P не недерминированно, то использование конструкциии [||] совершенно необязательно. Хотя для determ/multi уже можно.

ps
кстати, жаль что в книге никак не выделяются ключевые слова.
Ответить с цитированием
  (#14 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,841
Сказал(а) спасибо: 2
Поблагодарили 285 раз(а) в 285 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 06.12.2015, 17:40

Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
Конечно, если P не недерминированно, то использование конструкции [||] совершенно необязательно. Хотя для determ/multi уже можно.
Да, согласен. Можно было бы написать, что Р может иметь любой режим детерминизма, но в случае single, determ, erroneus нет никакого смысла в использовании коллектора списка (привести примеры). А в случае multi можно по дурке нарваться на бесконечный список и получить exception (привести пример). Поэтому nondeterm - это самый ходовой режим детерминизма для [||].
Договоримся включить это описание во второе издание, лет через 10
Цитата:
Сообщение от SergeMukhin78 Посмотреть сообщение
кстати, жаль что в книге никак не выделяются ключевые слова
Все английские слова (в т.ч. ключевые) выделяются шрифтом - курьер. Или нет?

У Вас в Питере сегодня в воскресенье плохая погода и поэтому нельзя выйти на пиво с таранькой/чехонью/жерехом/хамсой_азовской/подставить_по_вкусу ???
Я очень признателен, что Вы тратите личное время в выходной день на просмотр книжки, честное слово

А у нас дурдом на работе - ВУЗ готовится к аккредитации. Уже месяц большие начальники истерят и разводят панику. А мы, простые исполнители, пишем вагоны макулатуры для мусорной корзины. Некоторые не выдерживают этого психоза и увольняются. Причём уходят самые лучшие, уходят программировать на удалёнку. Остаются дауны и идиоты, которые ничего не умеют.
Ответить с цитированием
  (#15 (permalink)) Старый
SergeMukhin78 SergeMukhin78 вне форума
Member
 
Сообщений: 466
Сказал(а) спасибо: 17
Поблагодарили 31 раз(а) в 31 сообщениях
Регистрация: 28.03.2012
По умолчанию 06.12.2015, 17:49

Цитата:
Сообщение от Винитарх Посмотреть сообщение
single, determ, erroneus
single - это видимо procedure
Цитата:
Сообщение от Винитарх Посмотреть сообщение
А в случае multi можно нарваться на бесконечный список
это я не понял. отличие от nondeterm только то, что гарантируется один элемент. Зацикливание возможно так же как и у nondeterm.
Цитата:
Сообщение от Винитарх Посмотреть сообщение
нет никакого смысла в использовании коллектора списка (привести примеры)
не надо такие лишние примеры, они ничему не учат, а книгу перегружают.
Цитата:
Сообщение от Винитарх Посмотреть сообщение
Все английские слова (в т.ч. ключевые) выделяются шрифтом - курьер. Или нет?
я что-то не заметил.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ставлю систему "с нуля" после сбоя. Какие "работы" по тестированию железа полезны? russcand Любые вопросы от новичков 14 01.09.2011 00:27
Нужен курсач карточная "Цыганка" игра на языке пролог Prudnikovvv Prolog 0 20.11.2010 17:34
Инструкция по адресу "0x436b10f" обратилась к памяти "0x03793dac". ВИРУС???? skazka Windows XP 5 21.03.2010 01:21
Игра "Агрессия" при запуске выдает ошибки. Лог ошибки в теме. rauchend Любые вопросы от новичков 9 20.02.2009 14:51
После подключения кнопок "power" и "reset" компьютер перестал включаться. Лаборант-Шурупов Любые вопросы от новичков 1 25.01.2009 15:15
Программирование на CLIPS. Игра "пятнашки" bunya Информационные технологии 2 13.11.2008 01:27
Программирование "мышки" какую использовать функцию sc_pt С/С++ 3 23.05.2007 00:34
Добавить кнопки "свернуть" и "восстановить" к окну готового dialog-based приложения Lesat Visual C++ 2 07.01.2006 04:34
Курсовая "Параметрическое программирование" Серж. Вопросы начинающих программистов 0 30.07.2004 06:51
После компиляции кнопки caption на "Пуск" не отображаются на русском языке Anonymous Visual C++ 1 02.02.2004 22:21
Как сделать чтобы вместо кнопок "Да" и "Нет" высвечивалось украинсие "Так" и "Ні" Форсаж Delphi 5 19.07.2003 19:30
Исправление системной ошибки "error LNK2001" в программировании Elena_gr Вопросы начинающих программистов 3 18.06.2003 16:28



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов