Логічне програмування

Логі́чне програмува́ння парадигма програмування, а також розділ дискретної математики, що вивчає методи і можливості цієї парадигми, засновані на виведенні нових фактів з даних фактів згідно із заданими логічними правилами. Логічне програмування засноване на теорії математичної логіки. Найвідомішою мовою логічного програмування є Prolog, що є за своєю суттю універсальною машиною виводу, що працює в припущенні замкненості системи фактів.

Першою мовою логічного програмування була мова Planner, в якій була закладена можливість автоматичного виведення результату з даних і заданих правил перебору варіантів (сукупність яких називали «планом»). Planner використовували для, зниження вимог до обчислювальних ресурсів (за допомогою методу пошуку з поверненням) і для виведення фактів без активного використання стеку. Потім була розроблена мова Prolog, яка не вимагала плану перебору варіантів і була, в цьому сенсі, спрощенням мови Planner.

На основі ідей Planner були створені такі мови логічного програмування, як: QA-4, Popler, Conniver і QLISP. Мови програмування Mercury, Visual Prolog, Oz і Fril були створені на основі Prolog. На основі мови Planner було розроблене також декілька альтернативних мов логічного програмування, не заснованих на методі пошуку з поверненням, наприклад, Ether.

Історія

Використання математичної логіки для представлення і виконання комп'ютерних програм також є властивістю лямбда-числення, розробленого Алонзом Черч в 1930-х роках. Однак, першим запропонував використовувати кон'юнктивну нормальну форму логіки для представлення комп'ютерних програм — Корделл Грін.[1] Було використано аксіоматизацію підмножини LISP разом з представленням відношення вводу-виводу для обчислення відношення шляхом моделювання виконання програми в LISP. З іншого боку, мова Absys, розроблена Фостером і Елкоком, використовувала комбінацію рівнянь і лямбда-числення у вигляді тверджень без обмежень на порядок виконання операцій.[2]

Логічне програмування в нинішньому вигляді можна простежити до дискусій в кінці 1960-х і початку 1970-х років про порівняння декларативного і процедурного представлення знань в штучному інтелекті. Прихильники декларативного представлення, працювали в Стенфорді, пов'язані з Джоном Маккарті, Бертрамом Рафаелем і Корделлом Грін, а також в Единбурзі з Джоном Аланом Робінсоном (академічним гостем із Сіракузького університету), Пат Гейз і Робертом Ковальські. Прихильники процедурного представлення були в основному зосереджені в Массачусетському технологічному інституті під керівництвом Марвіна Мінського та Сеймура Пейперта.

Хоча він[хто?] був заснований на доказових методах логіки як на Planner, був розроблений в Массачусетському технологічному інституті, також був першою мовою, який з'явився в рамках цієї процедурної парадигми. Planner показував шаблонне звернення процедурних планів від цілей (наприклад, мета-скорочення або зворотній ланцюжок) і від тверджень (тобто прямий вивід). Найбільш впливова реалізація Planner була підмножиною під назвою Micro-Planner, реалізованого Джеррі Суссманом, Юджином Чарняком і Террі Виноградом. Він був використаний для реалізації програми WinRED з вивченням природної мови SHRDLU, яка була орієнтиром в той час.Щоб впоратися з дуже обмеженими системами пам'яті, Планувальник використовував структуру управління зворотним трасуванням, щоб одночасно зберігати тільки один можливий шлях обчислення. Планувальник привів до появи мов програмування таких як: QA-4, Popler, Conniver, QLISP і паралельні мови Ether.

Гейс і Ковальський в Единбурзі намагалися узгодити логічний підхід декларативного підходу до подання знань з процедурних підходів Планера. Hayes (1973) розробив екваціональну мову, Golux, в якому різні процедури можуть бути отримані шляхом зміни поведінки доведення теорем. Ковальський, з іншого боку, розробив SLD-резолюція, варіант SL-резолюції і показав, як він розглядає наслідки «процедури скорочення мети». Ковальський співпрацював з Colmerauer в Марселі, який розробив ці ідеї при розробці та впровадженні мови програмування Prolog.

Асоціація логічного програмування була створена для підтримання логічного програмування в 1986 році.

У Prolog з'явилися мови програмування ALF, Fril, Gödel, Mercury, Oz, Ciao, Visual Prolog, XSB і λProlog, а також безліч мов паралельного логічного програмування, мови логіки обмежень програмування і Datalog.

Формальна логіка як основа логічного програмування. Метод резолюцій

Для будь-якої системи логічного програмування характерним є те, що для виконання програми (побудови виведення результату) використовується вмонтована система автоматичного пошуку. Механізм пошуку логічного висновку Prolog-у бере свій початок від методу резолюцій Робінсона. Правило резолюції виведення логічного висновку працює наступним чином: дві фрази можуть резольвувати між собою, коли одна з них має позитивний, а друга — негативний літерал з одним і тим самим позначенням предикату та однаковою кількістю аргументів і в разі, якщо аргументи обох літералів можуть бути уніфіковані (погоджені). Наприклад, фраза P(a, b) o Q(c, d) і фраза Q(c, d) o R(b, c) дають резольвенту P(a, b) o R(b, c). Якщо ж аргументом відношення є змінна, то вона уніфікується з константою, а резольвента буде мати дану константу на місцях попереднього розташування змінної. Розглянемо дві фрази спеціального вигляду: Р(а) — висловлювання без умови і oP(а) — умова без висловлювання. Наявність цих двох фраз в одній теорії є протиріччям. Якщо вони резольвуються між собою, тоді отримана резольвента називається порожньою фразою. Якщо при резолюції двох фраз, що входять до складу теорії, отримується порожня фраза, то теорія буде непослідовною.

Концепції

Логіка і управління

Логічне програмування можна розглядати як контрольований висновок. Важливою концепцією у логічному програмуванні є розділення програм на їх логічний компонент і їх компонент управління. З чистими логічними мовами програмування, тільки логічний компонент визначає отримані рішення. Компонент управління може бути змінений для забезпечення альтернативних способів виконання логічної програми. Це поняття зафіксовано гаслом: Алгоритм = Логіка + Управління. Де «Логіка» являє собою логічну програму, а «Контроль» являє собою різні стратегії доказу теорем.[3]

Рішення проблем

У спрощеному пропозиціональному випадку, коли логічна програма і атомна мета верхнього рівня не містять змінних, зворотне міркування визначає дерево and-or, яке являє собою простір для пошуку рішення завдання. Мета верхнього рівня — корінь дерева. Для будь-якого вузла у дереві і будь-якої пропозиції, головка якого збігається з вузлом, існує набір дочірніх вузлів, відповідних підцілях в тексті пропозиції. Ці дочірні вузли групуються разом «і». Альтернативні набори дітей, відповідні альтернативні способи вирішення вузла, групуються разом «або».

Будь-яка пошукова стратегія може використовуватися для пошуку цього простору. У Prolog використовується послідовна стратегія «назад-у-перших», зворотне трасування, в якій одночасно розглядається тільки одна альтернатива і одна підціль. Можливі також інші стратегії пошуку, такі як паралельний пошук, інтелектуальний відкат або кращий початковий пошук для пошуку оптимального рішення.

У більш загальному випадку, коли змінні спільного використання підцілей можуть використовуватися, можна використовувати інші стратегії, такі як вибір найбільш підходящої підцілі або достатнього примірника, так що застосовується тільки одна процедура. Такі стратегії, які використовуються, наприклад, при паралельному логічному програмуванні.

Заперечення як відмова

Для більшості практичних додатків, а також для додатків, які вимагають немонотонного міркування в штучному інтелекті, логічні програми клаузули Хорна необхідно поширювати на звичайні логічні програми з негативними умовами. Положення в нормальній логічній програмі має вигляд:

читається декларативно як логічне вираження:

де H та всі і  — атомні формули. Заперечення негативних літералах, а не , зазвичай називається «запереченний збій», оскільки в більшості реалізацій показано негативна умова, а не , показуючи, що позитивна умова не виконується. Наприклад:

canfly(X) :- bird(X), not abnormal(X).
abnormal(X) :-  wounded(X).
bird(john).
bird(mary).
wounded(john).

Враховуючи мету знайти щось, що може літати:

:- canfly(X).

Існує два рішення, які вирішують першу підцільну птицю (X), а саме X = john і X = mary. Друга підціль не є ненормальним (john) для першого рішення, кандидату не вдається, бо поранений (john) досягає успіху отже і ненормальний (john) досягає успіху. Тим не менш, друга підціль не є ненормальним (mary) для другого рішення, кандидат успішний, бо поранений (mary) але зазнає невдачу, а отже і ненормальний (mary) зазнає невдачі. Отже, X = mary — єдине рішення цілі.

Мікро-планувальник який було побудовано, називається «thnot», який при нанесенні на вираз повертає значення True, якщо (і тільки якщо) оцінка вираження завершується. Еквівалентний оператор зазвичай вбудований в сучасний «Пролог». Це зазвичай пишуться not(Goal) або \+ Goal , де Goal є (пропозиція) для програми. Цей оператор відрізняється від заперечення в логіці першого порядку: заперечення, наприклад \+ х == 1 завершується, коли змінна х зв'язана з атомом 1, але він досягає успіху у всіх інших випадках, у тому числі, коли x є неприв'язаний. Це робить міркування у Пролозі немонотонно: х = 1, \+ х == 1 і завжди зазнає невдачі, А \+ Х == 1, х = 1 може досягти успіху, прив'язки до 1 в залежності від x ,якщо x був спочатку прив'язаний (зверніть увагу, що стандартний Пролог виконує цілі зліва направо).

Логічний статус заперечення як невдачі, так і залишився невирішеним, поки Кейт Кларк [1978] показали, що при певних природних умовах, це правильне (а іноді і повне) виконання класичного заперечення щодо завершення програми. Завершення приблизно збігається з набором всіх пропозицій програми, з тим же предикатом на лівій стороні, скажімо: H :- Body1.

H :- Bodyk.
Визначення предиката

H iff (Body1 or … or Bodyk)

де «iff» означає «якщо і тільки якщо». Написання завершення також вимагає явного використання предиката рівності і включення набору відповідних аксіом для рівності. Тим не менш, реалізація заперечення невдачею вимагає тільки if-половин визначень без аксіом рівності.

Наприклад, завершення вищенаведеної програми:

canfly(X) iff bird(X), not abnormal(X).
abnormal(X) iff wounded(X).
bird(X) iff X = john or X = mary.
X = X.
not john = mary.
not mary = john.

Поняття завершення тісно пов'язано з семантикою опису Маккарті для аргументації за замовчуванням і закритим світовим припущенням.

В якості альтернативи семантики завершення, заперечення як невдача може інтерпретуватися епістемічно, як і в семантиці стійких моделей та у відповідь множин програмування. У цій інтерпретації () не означає буквально, що не відома або не враховується. Епітимічна інтерпретація має перевагу, що її можна комбінувати дуже просто з класичним запереченням, як у «розширеному логічному програмуванні», для формалізації таких фраз, як «протилежне не можна показати», де «навпаки» є класичним запереченням і «навпаки не може бути показаним» є епістичною інтерпретацією заперечення як невдачі.

Представлення знань

Той факт, що пропозиції Хорна можуть бути дані процедурної інтерпретацією, і навпаки, що процедури усунення мети можна зрозуміти як пропозиції Хорна + зворотнє міркування означає, що логічні програми об'єднують декларативні і процедурні представлення знань. Включення заперечення як відмови означає, що логічне програмування є свого роду немонотонною логікою.

Попри свою простоту порівняно із класичною логікою, ця комбінація пропозицій Хорна і заперечення невдачі виявилася напрочуд виразним. Наприклад, він забезпечує природне подання для здорового глузду законів причини і слідства, а формалізується як ситуаційне числення та числення подій.Було також показано, що він цілком природно відповідає напівформальній мові законодавства. Зокрема, Праккен і Сартор кредитують подання Британського закону про громадянство як логічної програми будучи «надзвичайно впливовим для розробки обчислювальних уявлень законодавства, показуючи, як логічне програмування дозволяє інтуїтивно привабливими уявленнями, які можуть бути безпосередньо розгорнуті для створення автоматичних висновків».

Prolog

Пролог(Prolog) — мова логічного програмування загального призначення, пов'язана зі штучним інтелектом та математичною лінгвістикою.

Пролог має корені в логіці першого порядку, математичній логіці, та, на відміну від багатьох інших мов програмування, є декларативною: логіка програми виражається в термінах відношень, представлених як факти та правила. Обчислення ініціюється запуском запиту над цими відношеннями.

Цю мову програмування спочатку було задумано групою навколо Алана Кольмерое в Марселі на початку 1970-тих, а першу систему Пролог було розроблено в 1972-му Аланом Кольмерое та Філіпом Русселем.

Пролог була однією з перших логічних мов програмування, й залишається найпопулярнішою серед таких мов і на сьогодні, маючи декілька безкоштовних та комерційних реалізацій. Її застосовували як для доведення теорем, експертних систем, так і для її початкової області призначення, обробки природної мови. Сучасні середовища Прологу підтримують як створення графічних інтерфейсів користувача, так і адміністративні або мережеві застосування.

Пролог добре підходить для розв'язання специфічних задач, що виграю́ть від логічних запитів на базі правил, таких як пошук базами даних, системи голосового керування та заповнення шаблонів.

Варіанти та розширення

Абдуктивне логічне програмування

Абдуктивне логічне програмування — це розширення нормального логічного програмування, яке дозволяє деяким предикатам, оголошеним як предикати, бути «відкритими» або невизначеними. Речення в логічній програмі абдуктивної логіки має вигляд:

де H — атомна формула, яка не є неприводимою, всі є текстовими значеннями, предикат яких не є неприводимим, а  — атомними формулами, предикат яких є неприводимим. Неприводимі предикати можуть бути обмежені обмеженнями цілісності, які можуть мати форму:

де  — довільні літерали (визначені або неприводимі, а також атомні або негативні). Наприклад:

canfly(X) :- bird(X), normal(X).
false :-  normal(X), wounded(X).
bird(john).
bird(mary).
wounded(john).

де нормаль предиката є неприводимою.

Рішення проблем досягається шляхом виведення гіпотез, що виражаються в термінах відтворюваних предикатів, як рішень розв'язуваних завдань. Цими проблемами можуть бути або спостереження, які необхідно пояснити (як у класичних абдуктивних міркуваннях), так і цілі, які необхідно вирішити (як у звичайному логічному програмуванні). Наприклад, гіпотеза нормальна (mary) пояснює наглядову метелика (mary) . Більше того, та ж сама гіпотеза тягне за собою єдине рішення X = mary мета знайти щось, що може літати:

: -  canfly ( X ).

Логічне програмування абдукції було використано для діагностики несправностей, планування, обробки природної мови і машинного навчання. Він також використовувався для інтерпретації Заперечення як Відмова як форми абдуктивного міркування.

Металогічне програмування

Оскільки математична логіка має давню традицію розрізнення між мовою об'єктів і метамовою, логічне програмування також дозволяє метарівневе програмування. Найпростіша металогічна програма — це так званий мета-інтерпретатор «ванілі»:

solve(true).
    solve((A,B)):- solve(A),solve(B).
    solve(A):- clause(A,B),solve(B).

де true являє собою порожню кон'юнкцію, а пропозиція (A, B) означає, що існує пропозиція рівня об'єкта форми A: — B.

Метаномічне програмування дозволяє комбінувати уявлення об'єктів і метарівнів, як на природній мові. Він також може використовуватися для реалізації будь-якої логіки, яка задається за допомогою правил виведення . Metalogic використовується в логічному програмуванні для реалізації метапрограм, які маніпулюють іншими програмами, базами даних, базами знань або аксіоматичними теоріями в якості даних.

Програмування логіки обмежень

Основна стаття: Логічне програмування з обмеженнями

Логічне програмування з обмеженнями поєднує в собі логічне програмування логіки Horn з рішенням обмеження . Він розширює пропозиції Хорна, дозволяючи деяким предикатам, оголошеними предикатами обмеження, зустрічатися як літерали в сукупності статей. Логічна програма обмеження являє собою набір пропозицій виду:

де H та всі - атомні формули, а  — обмеження. Декларативно такі положення розглядаються як звичайні логічні наслідки: H, якщо

Однак, у той час як предикати є в главах розділів і визначаються програмою логіки обмежень, предикати обмеження зумовлені певною теоретико-просторовою структурою або теорією.

Процедурні підцілі, предикат який визначається програмою, вирішуються шляхом усунення мети, як у звичайному логічному програмуванні, але обмеження перевіряються на здійснимість за допомогою спеціалізованого вирішувача обмежень, який реалізує семантику предикатів обмежень. Вихідна задача вирішується шляхом її скорочення до здійсненним кон'юнкції обмежень.

Наступна логічна програма обмеження являє собою іграшкову тимчасову базу даних історії Джона як вчителя:

teaches(john, hardware, T) :- 1990  T, T < 1999.
teaches(john, software, T) :- 1999  T, T < 2005.
teaches(john, logic, T) :- 2005  T, T  2012.
rank(john, instructor, T) :- 1990  T, T < 2010.
rank(john, professor, T) :- 2010  T, T < 2014.

Тут ≤ та < — предикати обмеження, з їх звичайною передбачуваною семантикою. Наступне речення мети запитує базу даних, щоб дізнатися, коли Джон викладав логіку і був професором:

:- teaches(john, logic, T), rank(john, professor, T).

Рішенням є : 2010 T, T 2012.

Логічне програмування обмежень використовувалося для вирішення проблем у таких галузях, як цивільне будівництво, машинобудування, цифрова електроніка, автоматизоване планування та диспетчеризація, управління повітряним рухом і фінанси. Він тісно пов'язаний з абдуктивним логічним програмуванням.

Паралельне логічне програмування

Основна стаття: паралельне логічне програмування

Паралельне логічне програмування об'єднує концепції логічного програмування з паралельним програмуванням. Його розвиток отримав великий поштовх у 1980-х роках за його вибором для мови системного програмування японського проекту п'ятого покоління (FGCS).

Паралельна логічна програма являє собою набір захищених диз'юнктів Горна форми:

Кон'юнкція називається захистом пропозиції, а | є оператором зобов'язання. Декларативно охоронювані положення Горна читаються як звичайні логічні наслідки: H, якщо

Тим не менш, процедурно, коли є кілька пропозицій, голови H яких відповідають заданої мети, тоді всі параграфи виконуються паралельно, перевіряючи, чи перебувають їх гвардії . Якщо огорожі більш ніж однієї пропозиції зберігаються, то в один з пропозицій робиться рішучий вибір, а виконання виконується з допомогою підцілей вибраної пропозиції. Ці підцілі можуть також виконуватися паралельно. Таким чином, паралельне логічне програмування реалізує форму "не піклується про недетермінізм", а не «не знає недетермінізм».

Наприклад, наступна паралельна логічна програма визначає предикат shuffle (Left, Right, Merge) , який можна використовувати для перемішування двох списків вліво і вправо, об'єднуючи їх в один список Merge, який зберігає порядок двох списків вліво і вправо:

shuffle ([],  [],  []). 
shuffle ( Left ,  Right ,  Merge )  : - 
    Left  =  [ First  |  Rest ]  | 
    Merge  =  [ First  |  ShortMerge ], 
    shuffle ( Rest ,  Right ,  ShortMerge ). 
shuffle ( Left ,  Right ,  Merge )  : - 
    Right  =  [ First  |  Rest ]  |
    Merge  =  [ First  |  ShortMerge ], 
    shuffle ( Left ,  Rest ,  ShortMerge ).

Представляє [ ] порожній список, а [Head|Tail] представляє список з першим елементом Head, за яким слідує список Tail, як Prolog. (Зверніть увагу, що перше входження | у другому і третьому реченнях є конструктором списку, тоді як друге входження | є оператором зобов'язання.) Програма може використовуватися, наприклад, для перетасовки списків [ace, queen, king ] та [1, 4, 2], викликаючи пропозицію цілі:

shuffle([ace, queen, king], [1, 4, 2], Merge)

Програма буде детерміновано генерувати одне рішення, наприклад Merge = [ace, queen, 1, king, 4, 2] .

Можливо, паралельне логічне програмування засноване на передачі повідомлень і, отже, піддається тій же невизначеності, що і інші паралельні системи передачі повідомлень, такі як «Актори» (див. «Невизначеність при паралельному обчисленні»). Карл Хьюітт стверджував, що паралельне логічне програмування не засноване на логіці в його розумінні того, що обчислювальні етапи не можуть бути логічно виведені. Однак у паралельному логічному програмуванні будь-який результат завершального обчислення є логічним наслідком програми, і будь-який частковий результат часткового обчислення є логічним наслідком програми і залишкової мети (мережі процесів). Отже, невизначеність обчислень є наувазі, що не всі логічні наслідки програми можуть бути виведені.

Паралельне програмування логіки обмеження

Основна стаття: Логічне програмування паралельних обмежень

Паралельне логічне програмування обмежень об'єднує паралельне логічне програмування та програмування логіки обмежень, використовуючи обмеження для управління паралелізмом. Пропозиція може містити охорону, яка являє собою набір обмежень, які можуть блокувати застосовність цієї пропозиції. Коли захист кількох пропозицій виконується, паралельне програмування логіки обмежень робить рішучий вибір для використання тільки одного.

Індуктивно логічне програмування

Основна стаття: Програмування індуктивної логіки

Індуктивне логічне програмування пов'язане з узагальненням позитивних і негативних прикладів у контексті фонових знань: машинне навчання логічних програм. Недавня робота в цій області, що поєднує логічне програмування, навчання і ймовірність, породила нову область статистичного реляційного навчання та ймовірнісного індуктивного логічного програмування .

Об'єктно-орієнтоване логічне програмування

F-logic розширює логічне програмування об'єктами та синтаксисом фреймів. Багато систем базуються на F-logic, включно з Flora-2 FLORID, і високомаштабовною комерційною системою Ontobroker.

Logtalk розширює Пролог підтримкою об'єктів, протоколів та інших понять ООП.

Лінійне логічне програмування

Логічне програмування на основі логіки в лінійній логіці призвело до створення мов логічного програмування, які значно виразніші, ніж ті, які засновані на класичній логіці. Програми пропозиції Horn можуть представляти тільки зміну станом шляху, зміни аргументів в предикаті. У лінійному логічному програмуванні можна використовувати лінійну логіку для підтримки зміни стану. Деякі ранні розробки логічних мов програмування на основі лінійної логіки включають LO [Andreoli & Pareschi, 1991], Lolli, [14] ACL, і Forum [Miller, 1996]. Форум забезпечує цілеспрямовану інтерпретацію всієї лінійної логіки.

Програмування логіки транзакцій

Логіка транзакцій — це розширення логічного програмування з логічної теорією оновлень, що змінюють стан. Він має як теоретико-модельну семантику, так і процедурну. Реалізація підмножини логіки транзакцій доступна в системі Flora-2. Інші прототипи також доступні.

Логічне програмування вищого порядку

Деякі дослідники розширюють логічне програмування можливостями програмування вищого порядку успадкованих від логіки вищого порядку, таких як предикати-змінні. Реалізацією є наприклад розширення мови Пролог такі як HiLog and λProlog.

Примітки

  1. Cordell Green. Application of Theorem Proving to Problem Solving. IJCAI 1969.
  2. J.M. Foster and E.W. Elcock. ABSYS 1: An Incremental Compiler for Assertions: an Introduction, Machine Intelligence 4, Edinburgh U Press, 1969, pp. 423–429
  3. R.A.Kowalski (July 1979). Algorithm=Logic + Control. Communications of the ACM 22 (7): 424–436. doi:10.1145/359131.359136.

Див. також

Література

  • Логічне і функціональне програмування : навч. посіб. [для студентів ВНЗ України] / В. М. Заяць, М. М. Заяць ; Нац. ун-т "Львів. політехніка". — Кам'янець-Подільський (Хмельниц. обл.) ; Львів : Гордукова І. Є., 2016. — 398 с. : іл., табл., портр.
  • Иван Братко. Алгоритмы искусственного интеллекта на языке PROLOG (Оригінал Prolog Programming For Artificial Intelligence)
  • John McCarthy. Programs with common sense Symposium on Mechanization of Thought Processes. National Physical Laboratory. Teddington, England. 1958.
  • Fisher Black. A deductive question answering system Harvard University. Thesis. 1964.
  • James Slagle. Experiments with a Deductive Question-Answering Program CACM. December, 1965.
  • Cordell Green. Application of Theorem Proving to Problem Solving IJCAI 1969.
  • Carl Hewitt. Planner: A Language for Proving Theorems in Robots IJCAI 1969.
  • Gerry Sussman and Terry Winograd. Micro-planner Reference Manual AI Memo No, 203, MIT Project MAC, July 1970.
  • Carl Hewitt. Procedural Embedding of Knowledge In Planner IJCAI 1971.
  • Terry Winograd. Procedures as a Representation for Data in a Computer Program for Understanding Natural Language MIT AI TR-235. January 1971.
  • Bruce Anderson. Documentation for LIB PICO-PLANNER School of Artificial Intelligence, Edinburgh University. 1972
  • Bruce Baumgart. Micro-Planner Alternate Reference Manual Stanford AI Lab Operating Note No. 67, April 1972.
  • Julian Davies. Popler 1.6 Reference Manual University of Edinburgh, TPU Report No. 1, May 1973.
  • Jeff Rulifson, Jan Derksen, and Richard Waldinger. QA4, A Procedural Calculus for Intuitive Reasoning SRI AI Center Technical Note 73, November 1973.
  • Robert Kowalski Predicate Logic as Programming Language Memo 70, Department of Artificial Intelligence, Edinburgh University. 1973.
  • Drew McDermott and Gerry Sussman. The Conniver Reference Manual MIT AI Memo 259A. January 1974.
  • Earl Sacerdoti, et al. QLISP: A Language for the Interactive Development of Complex Systems AFIPS National Computer Conference. 1976.
  • Bill Kornfeld and Carl Hewitt. The Scientific Community Metaphor IEEE Transactions on Systems, Man, and Cybernetics. January 1981.
  • Bill Kornfeld. The Use of Parallelism to Implement a Heuristic Search IJCAI 1981.
  • Bill Kornfeld. Parallelism in Problem Solving MIT EECS Doctoral Dissertation. August 1981.
  • Bill Kornfeld. Combinatorially Implosive Algorithms CACM. 1982
  • Carl Hewitt. The Challenge of Open Systems Byte Magazine. April 1985.
  • Robert Kowalski. The limitation of logic Proceedings of the 1986 ACM fourteenth annual conference on Computer science.
  • Ehud Shapiro (Editor). Concurrent Prolog MIT Press. 1987.
  • Robert Kowalski. The Early Years of Logic Programming CACM. January 1988.
  • Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys. September 1989.
  • Carl Hewitt and Gul Agha. Guarded Horn clause languages: are they deductive and Logical? International Conference on Fifth Generation Computer Systems, Ohmsha 1988. Tokyo. Also in Artificial Intelligence at MIT, Vol. 2. MIT Press 1991.
  • Shunichi Uchida and Kazuhiro Fuchi Proceedings of the FGCS Project Evaluation Workshop Institute for New Generation Computer Technology (ICOT). 1992.
  • Зубенко В. В. Програмування: навчальний посібник (гриф МОН України) / В. В. Зубенко, Л. Л. Омельчук. — К. : ВПЦ «Київський університет», 2011. — 623 c.
  • Нікітченко М. С. Теоретичні основи програмування: навчальний посібник / М.С Нікітченко — Ніжин: Видавництво НДУ імені Миколи Гоголя, 2010. — 121с.
  • Лавров С. С. Програмирование. Математические основи, средства, теория / С. С. Лавров. — СПб. : БХВ-Петербург,2001. — 251с.
  • Непейвода Н. Н. Основания програмирования: учеб. пособие / Н. Н. Непейвода, И. Н. Скопин. — Ижевск, 2003.
  • Pratt T.W., Zelkovitz M.V. Programming languages, design and implementation (4th ed.). Prentice Hall, 2000 (англ.) (Пратт Т., Зелкович М., Языки программирования: разработка и реализация.- Спб.: Питер, 2002.-688 с.)(рос.)
  • Gabbrielli, Maurizio (2010). Programming languages principles and paradigms. London, New York: Springer,. ISBN 9781848829145.
  • Robert W. Sebesta: Concepts of Programming Languages, 9th ed., Addison Wesley 2009.

Посилання


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.