Логическое программирование языки

Логическое программирование-это парадигма программирования. Которая в значительной степени основана на формальной логике. Любая программа. Написанная на языке логического программирования, представляет собой набор предложений в логической форме. Выражающих факты и правила о некоторой предметной области. Основные семейства языков логического программирования включают Prolog, answer set programming (ASP) и Datalog. На всех этих языках правила написаны в виде предложений:

H :- B1, …, Bn.

и читаются декларативно как логические следствия:

H if B1 and … and Bn.

H называется главой правила и B1, …, Bnназывается телом. Факты-это правила. Которые не имеют тела и написаны в упрощенном виде:

H.

В простейшем случае. В которомH,B1,…, Bnвсе атомарные формулы, эти предложения называются определенными предложениями или предложениями Рога. Однако есть много расширений этого простого случая. Самым важным из которых является случай. Когда условия в теле предложения также могут быть отрицаниями атомарных формул. Языки логического программирования. Включающие это расширение. Обладают возможностями представления знаний немонотонной логики.

В ASP и Datalog логические программы имеют только декларативное чтение. А их выполнение выполняется с помощью процедуры доказательства или генератора моделей. Поведение которых не должно контролироваться программистом.

Однако в семействе языков пролога логические программы также имеют процедурную интерпретацию как процедуры сокращения цели:

решать H, решать B1, а … и решить Bn.

Рассмотрим в качестве примера следующее предложение:

fallible(X) :- human(X).

на основе примера. Использованного Терри Виноградом[1] для иллюстрации планировщика языка программирования . Как предложение в логической программе. Он может быть использован как процедура для проверки того , есть ли

Xfallible, проверяя, есть лиXhuman, и как процедура для поиска Xтого, что естьfallible, находя Xто, что есть human. Даже факты имеют процессуальную интерпретацию. Например, предложение:

human(socrates).

может быть использован как как процедура , чтобы показать, что socratesестьhuman, так и как процедура, чтобы найти Xто, что естьhuman, socratesX.

Декларативное чтение логических программ может быть использовано программистом для проверки их корректности. Кроме того, методы преобразования логических программ также могут быть использованы для преобразования логических программ в логически эквивалентные программы. Которые являются более эффективными.

В семействе логических языков программирования Prolog программист также может использовать известное поведение механизма выполнения для решения задач для повышения эффективности программ.

Использование математической логики для представления и выполнения компьютерных программ также является особенностью лямбда-исчисления, разработанного Алонсо Черчем в 1930-х годах. Однако первое предложение использовать клаузальную форму логики для представления компьютерных программ было сделано Корделлом Грином.[2] Он использовал аксиоматизацию подмножества

ЛИСПАвместе с представлением отношения ввода-вывода для вычисления этого отношения путем моделирования выполнения программы на ЛИСПЕ. Абси Фостера и Элкока С другой стороны. Он использовал комбинацию уравнений и лямбда-исчисления в языке ассерционного программирования. Который не накладывает никаких ограничений на порядок выполнения операций.[3]

Логическое программирование в его нынешнем виде восходит к дискуссиям конца 1960-х и начала 1970-х годов о декларативном и процедурном представлении знаний в искусственном интеллекте. Сторонники декларативных представлений работали . В частности , в

Стэнфорде, где работали Джон Маккарти, Бертрам Рафаэль и Корделл Грин. А в ЭдинбургеДжон Алан Робинсон (академический гость из Сиракузского университета), Пэт Хейси Роберт Ковальски. Сторонники процедурных представлений были в основном сосредоточены в Массачусетском технологическом институтепод руководством Марвина Мински и Сеймура Паперта.]

Хотя он был основан на методах доказательства логики, Planner, разработанный в Массачусетском технологическом институте. Был первым языком. Возникшим в рамках этой процедуралистской парадигмы.[4] Планировщик отличался паттерн-направленным вызовом процедурных планов из целей (т. е. сокращение цели или обратная цепочка) и из утверждений (т. е. прямая цепочка). Наиболее влиятельной реализацией Planner было подмножество Planner. Называемое Micro-Planner. Реализованное Джерри Сассманом, Юджином Чарняком и Терри Виноградом. Он был использован для реализации программы виноградского понимания естественного языка SHRDLU, которая была знаковой в то время.[1] Чтобы справиться с очень ограниченными системами памяти в то время. Планировщик использовал структуру управления обратным отслеживанием. Так что одновременно должен был храниться только один возможный путь вычислений. Планировщик дал начало языкам программирования QA-4, Popler, Conniver. QLISP и параллельному языку Ether.]

Хейз и Ковальски в Эдинбурге попытались примирить основанный на логике декларативный подход к представлению знаний с процедурным подходом Планировщика. Хейс (Hayes, 1973) разработал эквационный язык Golux. В котором различные процедуры могут быть получены путем изменения поведения доказателя теоремы.[5] Ковальский, с другой стороны. Разработал SLD resolution. Вариант SL-resolution,[7] и показал. Как он трактует импликации как процедуры сокращения цели. Ковальский сотрудничал с Кольмерауэром в Марселе. Который развил эти идеи при проектировании и реализации языка программирования Prolog.

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

Пролог породил языки программирования ALF, Fril, Gödel, Mercury, Oz, Ciao, Visual Prolog, XSBи λProlog, а также множество параллельных логических языков программирования, языковпрограммирования логики ограничений и Datalog.]

Логика и управление

Логическое программирование можно рассматривать как управляемый вывод. Важным понятием в логическом программировании является разделение программ на их логическую составляющую и управляющую составляющую. При использовании языков программирования с чистой логикой один только логический компонент определяет производимые решения. Компонент управления может быть изменен. Чтобы обеспечить альтернативные способы выполнения логической программы. Это понятие захвачено лозунгом

Алгоритм = Логика + Управление

где [10]

Решение проблем

В упрощенном. Пропозициональном случае. Когда логическая программа и атомарная цель верхнего уровня не содержат переменных . Обратное рассуждение определяет дерево и-или, которое представляет собой пространство поиска для решения цели. Цель верхнего уровня — это корень дерева. Учитывая любой узел в дереве и любое предложение. Голова которого соответствует узлу. Существует набор дочерних узлов. Соответствующих подцел в теле предложения. Эти дочерние узлы сгруппированы вместе буквой Альтернативные наборы дочерних элементов. Соответствующие альтернативным способам решения узла. Группируются вместе с помощью

Для поиска в этом пространстве можно использовать любую стратегию поиска. В Прологе используется последовательная стратегия Возможны и другие стратегии поиска. Такие как параллельный поиск. Интеллектуальный поиск в обратном направлении или поиск оптимальных решений.

В более общем случае. Когда подцели разделяют переменные. Могут использоваться другие стратегии. Такие как выбор подцели. Которая наиболее высоко инстанцирована или достаточно инстанцирована. Чтобы применялась только одна процедура. Такие стратегии используются, например, в параллельном логическом программировании.

Отрицание как неудача

Для большинства практических приложений. А также для приложений. Требующих немонотонных рассуждений в искусственном интеллекте. Логические программы предложения Хорна должны быть расширены до обычных логических программ с отрицательными условиями. Предложение в обычной логической программе имеет вид:

H :- A1, …, An, not B1, …, not Bn.

и читается декларативно как логическая импликация:

H if A1 and … and An and not B1 and … and not Bn.

где Hи все Aiи Biявляются атомарными формулами. Отрицание в отрицательных литералах not Biобычно называют отрицанием как неудачей not Biвыполняется, показывая. Что положительное условие Biне выполняется. Например:

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

Учитывая цель найти что-то. Что может летать:

:- canfly(X). 

есть два возможных решения. Которые решают первую подцель bird(X), X = johnа именноX = mary: Вторая подцель not abnormal(john)первого решения-кандидата терпит неудачу. Потому wounded(john)что преуспевает и. Следовательноabnormal(john), преуспевает. Однако вторая подцель not abnormal(mary)второго решения-кандидата преуспевает. Потому wounded(mary)что терпит неудачу и. Следовательноabnormal(mary), терпит неудачу. Следовательно, X = maryэто единственное решение поставленной цели.

У Микро-планировщика была конструкция. Называемая Эквивалентный оператор обычно встроен в современные реализации пролога. Обычно он записывается как not(Goal)или \+ Goal, где Goalнекоторая цель (предложение) должна быть доказана программой. Этот оператор отличается от отрицания в логике первого порядка: отрицание , например, \+ X == 1терпит неудачу, когда переменная Xбыла связана с атомом1, но оно успешно во всех других случаях. В том числе и когда Xне связано. Это делает рассуждения Пролога немонотонными: X = 1, \+ X == 1всегда терпит неудачу, в то время как \+ X == 1, X = 1 может быть успешным, привязка Xк 1, в зависимости от того. Был ли Xизначально привязан (обратите внимание. Что стандартный пролог выполняет цели в порядке слева направо).

Логический статус отрицания как неудачи оставался неразрешенным до тех пор. Пока Кит Кларк [1978] не показал. Что при определенных естественных условиях это правильная (а иногда и полная) реализация классического отрицания по отношению к завершению программы. Завершение сводится примерно к рассмотрению множества всех программных предложений с одним и тем же предикатом в левой части, скажем

H :- Body1.
H :- Bodyk.

как определение предиката

H iff (Body1 or … or Bodyk)

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

Например, завершение вышеприведенной программы таково::

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.

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

В качестве альтернативы семантике завершения отрицание как неудача также может быть интерпретировано эпистемически. Как в стабильной семантике модели программирования набора ответов. В этой интерпретации не(Bi) буквально означает. Что Bi не известно или не верится. Эпистемическая интерпретация имеет то преимущество. Что ее можно очень просто объединить с классическим отрицанием, как в

Представление

Тот факт, что предложения Рога могут быть даны процедурной интерпретации и, наоборот. Что процедуры сокращения цели могут быть поняты как предложения Рога + обратное рассуждение, означает. Что логические программы объединяют декларативные и процедурные представления знаний. Включение отрицания как неудачи означает. Что логическое программирование является разновидностью немонотонной логики.

Несмотря на свою простоту по сравнению с классической логикой. Это сочетание предложений Рога и отрицания как неудачи оказалось удивительно выразительным. Например, он обеспечивает естественное представление для законов здравого смысла причины и следствия. Формализованных как в ситуационном исчислении, так и в исчислении событий. Было также показано. Что оно вполне естественно соответствует полуофициальному языку законодательства. В частности. Праккен и Сартор[11] считают. Что представление британской национальности выступает в качестве логической программы[12].] будучи

Варианты и расширения

Пролог

Язык программирования Prolog был разработан в 1972 году Аленом Кольмерауэром. Он возник в результате сотрудничества между Кольмерауэром в Марселе и Робертом Ковальски в Эдинбурге. Колмерауэр работал над пониманием естественного языка, используя логику для представления семантики и используя разрешение для ответа на вопросы. Летом 1971 года Кольмерауэр и Ковальски обнаружили. Что клаузальная форма логики может быть использована для представления формальных грамматик и что доказательства теоремы разрешения могут быть использованы для разбора. Они заметили. Что некоторые доказатели теорем. Такие как гиперразрешение. Ведут себя как парсеры снизу вверх, а другие. Такие как SL-resolution (1971). Ведут себя как парсеры сверху вниз.

Следующим летом 1972 года Ковальский. Снова работая с Кольмерауэром. Разработал процедурную интерпретацию следствий. Эта двойная декларативная/процедурная интерпретация позже была формализована в нотации пролога

H :- B1, …, Bn.

которые могут быть прочитаны (и использованы) как декларативно. Так и процедурно. Также стало ясно . Что такие предложения могут быть ограничены определенными предложениями или предложениями Хорна, гдеH,B1,…, Bnявляются всеми формулами логики атомарных предикатов. И что SL-разрешение может быть ограничено (и обобщено) LUSH или SLD-разрешением. Процедурная интерпретация и МЕТОДЫ Ковальского были описаны в записке 1973 года. Опубликованной в 1974 году[6].]

Кольмерауэр вместе с Филиппом Русселем использовал эту двойственную интерпретацию предложений в качестве основы пролога. Который был реализован летом и осенью 1972 года. Первая пролог-программа. Также написанная в 1972 году и реализованная в Марселе. Представляла собой французскую систему ответов на вопросы. Использование пролога в качестве практического языка программирования получило большой импульс благодаря разработке компилятора Дэвидом Уорреном в Эдинбурге в 1977 году. Эксперименты показали. Что эдинбургский пролог может конкурировать со скоростью обработки других символических языков программирования. Таких как Lisp. Эдинбургский пролог стал де факто стандарт и сильно повлиял на определение стандарта ISO Prolog.

Похищающее логическое программирование

Похищающее логическое программирование-это расширение обычного логического программирования. Которое позволяет некоторым предикатам. Объявленным как похищаемые предикаты. Быть Предложение в программе похищающей логики имеет вид:

H :- B1, …, Bn, A1, …, An.

где Hатомарная формула. Которая не является похищаемой. Все Biявляются литералами. Предикаты которых не являются похищаемыми, и Aiявляются атомарными формулами. Предикаты которых являются похищаемыми. Похищаемые предикаты могут быть ограничены ограничениями целостности. Которые могут иметь вид:

false :- L1, …, Ln.

где теLi-произвольные литералы (определенные или похищаемые. Атомарные или отрицаемые). Например:

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

где предикат normalпохищаем.

Решение задачи достигается путем выведения гипотез. Выраженных в терминах похищаемых предикатов. Как решения решаемых задач. Эти проблемы могут быть либо наблюдениями. Требующими объяснения (как в классическом абуктивном мышлении), либо целями. Требующими решения (как в обычном логическом программировании). Например, гипотеза normal(mary)объясняет наблюдение canfly(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.

Металогическое программирование позволяет комбинировать представления на уровне объекта и на уровне металла. Как в естественном языке. Он также может быть использован для реализации любой логики. Которая определяется как правила вывода. Металогика используется в логическом программировании для реализации метапрограмм. Которые манипулируют другими программами. Базами данных. Базами знаний или аксиоматическими теориями в качестве данных.

Программирование логики ограничений

Программирование логики ограничений сочетает в себе логическое программирование предложений Хорна с решением ограничений. Он расширяет предложения Horn. Позволяя некоторым предикатам. Объявленным как предикаты ограничений. Встречаться как литералы в теле предложений. Программа логики ограничений представляет собой набор предложений вида:

H :- C1, …, Cn ◊ B1, …, Bn.

где Hи все остальныеBi-это атомарные формулы. А остальныеCi-ограничения. Декларативно такие предложения читаются как обычные логические следствия:

H if C1 and … and Cn and B1 and … and Bn.

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

Процедурно подцели. Предикаты которых определяются программой. Решаются путем редукции цели. Как и в обычном логическом программировании. Но ограничения проверяются на выполнимость с помощью специфичного для предметной области решателя ограничений. Который реализует семантику предикатов ограничений. Исходная задача решается путем сведения ее к удовлетворяемой совокупности ограничений.

Следующая логическая программа ограничения представляет собой игрушечную временную базу john'sданных истории в качестве учителя:

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. 

Здесь и находятся предикаты ограничения. С их обычной предполагаемой семантикой. Следующее предложение цели запрашивает базу данных. Чтобы узнать. Когда johnоба преподавали logicи былиprofessor:

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

Решение есть 2010 ≤ T, T ≤ 2012.

Логическое программирование ограничений использовалось для решения задач в таких областях . Как гражданское строительство, машиностроение, верификация цифровых схем , автоматизированное составление расписаний, управление воздушным движениеми финансы. Это тесно связано с похищающим логическим программированием.

Параллельное логическое программирование

Параллельное логическое программирование объединяет концепции логического программирования с параллельным программированием. Его развитие получило большой импульс в 1980-х годах благодаря выбору языка системного программирования японского проекта пятого поколения (FGCS)[13].]

Параллельная логическая программа представляет собой набор охраняемых предложений Рога вида:

H :- G1, …, Gn | B1, …, Bn.

Конъюнкция G1, ... , Gnназывается охранником предложения и | является оператором обязательства. Декларативно охраняемые предложения Рога читаются как обычные логические следствия:

H if G1 and … and Gn and B1 and … and Bn.

Однако процедурно. Когда есть несколько пунктов. Главы H которых соответствуют заданной цели. То все пункты выполняются параллельно, проверяя. Держатся ли их охранникиG1, ... , Gn. Если охранники более чем одного пункта удерживаются. То фиксированный выбор делается в отношении одного из пунктов. И выполнение продолжается с подцелями B1, ..., Bnвыбранного пункта. Эти подцели также могут выполняться параллельно. Таким образом. Параллельное логическое программирование реализует форму

Например, следующая параллельная логическая программа определяет предикат shuffle(Left. Right, Merge) , с помощью которого можно перетасовать два списка Leftи Right, объединив их в один списокMerge, сохранить порядок расположения двух списков LeftиRight:

перемешать([], [], []). перемешать(слева, справа, слияние) :- левый = [первый | остальные] | слияния = [первый | ShortMerge], перемешать(остальное, право, ShortMerge). перемешать(слева, справа, слияние) :- право = [Первый | остальные] | слияния = [первый | ShortMerge], перемешать(слева, остальные, ShortMerge). 

Здесь []он представляет пустой список и [Head | Tail]представляет список с первым элементомHead, за которым следует список Tail, как в Прологе. (Обратите внимание. Что первое вхождение | во втором и третьем предложениях-это конструктор списка, тогда как второе вхождение | -оператор обязательства.) Программа может быть использована, например, для перетасовки списков [ace, queen, king]и [1, 4, 2]вызова предложения goal:

shuffle([туз, ферзь, король], [1, 4, 2], Слияние). 

Например, программа недетерминированно генерирует одно решение Merge = [ace, queen, 1, king, 4, 2].

Возможно, параллельное логическое программирование основано на передаче сообщений. Поэтому оно подвержено той же неопределенности. Что и другие параллельные системы передачи сообщений. Такие как Акторы (см. Карл Хьюитт утверждал. Что параллельное логическое программирование не основано на логике в том смысле. Что вычислительные шаги не могут быть логически выведены.[14] Однако в параллельном логическом программировании любой результат завершающего вычисления является логическим следствием программы. А любой частичный результат частичного вычисления является логическим следствием программы и остаточной цели (технологической сети). Таким образом. Неопределенность вычислений подразумевает. Что не все логические следствия программы могут быть выведены.[нейтралитет оспаривается]

Параллельное программирование логики ограничений

Параллельное логическое программирование ограничений сочетает в себе параллельное логическое программирование и логическое программирование ограничений, используя ограничения для управления параллелизмом. Предложение может содержать защиту. Которая представляет собой набор ограничений. Которые могут блокировать применимость предложения. Когда охранники нескольких предложений удовлетворены. Параллельное логическое программирование ограничений делает решительный выбор в пользу использования только одного.

Индуктивное логическое программирование

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

Более того, логическое программирование

Некоторые исследователи расширили логическое программирование с помощью функций программирования более высокого порядка , производных от логики более высокого порядка, таких как переменные предиката. К таким языкам относятся расширения пролога HiLog и λProlog.

Линейная логика программирования

Базирование логического программирования в рамках линейной логики привело к созданию языков логического программирования. Которые значительно более выразительны, чем языки. Основанные на классической логике. Программы предложения Horn могут представлять только изменение состояния путем изменения аргументов в предикаты. В программировании линейной логики можно использовать окружающую линейную логику для поддержки изменения состояния. Некоторые ранние разработки языков логического программирования на основе линейной логики включают LO [Andreoli & Pareschi, 1991], Lolli,[15] ACL,[16] и Forum [Miller, 1996]. Форум обеспечивает целенаправленную интерпретацию всей линейной логики.

Объектно-ориентированного логического программирования

F-logic расширяет логическое программирование с помощью объектов и фреймового синтаксиса.

Logtalk расширяет язык программирования Prolog с поддержкой объектов. Протоколов и других концепций ООП. Он поддерживает большинство стандартных пролог-систем в качестве бэкэнд-компиляторов.

Операции логического программирования

Транзакционная логика-это расширение логического программирования с логической теорией обновлений. Изменяющих состояние. Она имеет как теоретико-модельную семантику. Так и процедурную. Реализация подмножества логики транзакций доступна в системе Flora-2. Имеются и другие прототипы .

  1. ^ b
  2. ^ Корделл Грин. Применение доказательства теоремы к решению задачИДЖКАЙ 1969.
  3. ^ J. М. Фостер и Э. В. Элкок. ABSYS 1: Инкрементный компилятор для утверждений: введение, Machine Intelligence 4, Edinburgh U Press, 1969, pp. 423-429
  4. ^ Карл Хьюитт. ИДЖКАЙ 1969.
  5. ^ Пэт Хейз. Вычисление и дедукция. В трудах 2-го симпозиума МФКС. Чехословацкая академия наук, 1973, с. 105-118.
  6. ^ b Роберт Ковальски, , Memo 70, Факультет искусственного интеллекта. Эдинбургский университет, 1973. Также в трудах Конгресса IFIP, Стокгольм, North Holland Publishing Co., 1974, pp. 569-574.
  7. ^ Роберт Ковальски, Дональд и Кюнер, , Искусственный интеллект, Том 2, 1971, стр.
  8. ^ Шапиро, Эхуд (1989). Семейство параллельных логических языков программирования (PDF). Международная летняя школа по логике. Алгебре и вычислениям. Также появился в Шапиро, Э. (1989). . ACM Computing Surveys. 21 (3): 413–510. doi:10.1145/72551.72555. S2CID 2497630.
  9. ^ Саенц-Перес, Фернандо; Кабальеро, Рафаэль; Гарсия-Руис. Иоланда (декабрь 2011 г.). Дедуктивная база данных с журналом данных и языком SQL-запросов. Азиатский симпозиум по языкам и системам программирования. 66-73.
  10. ^ Ковальски (июль 1979). Коммуникации АСМ. 22 (7): 424–436. doi:10.1145/359131.359136. S2CID 2509896.
  11. ^ Prakken, H. and Sartor, G., 2015. Закон и логика: обзор с точки зрения аргументации. Искусственный интеллект, 227, 214-245.
  12. ^ Sergot, M. J., Sadri. F., Kowalski. R. A., Kriwaczek. F., Hammond. P. and Cory. H. T., 1986. The British Nationality Act as a logic program. Сообщения АСМ, 29(5), 370-386.
  13. ^ Шунити Учида и Кадзухиро Фучи. Материалы Семинара по оценке проектовФСКН . Институт компьютерных технологий нового поколения (ICOT), 1992.
  14. ^ Хьюитт, Карл (27 апреля 2016 года). . Архивы Hal. Стр. 21-26. Получено 7 ноября 2016года .
  15. ^ Джошуа Ходас и Дейл Миллер, Логическое программирование во фрагменте интуиционистской линейной логикиИнформация и вычисления, 1994, 110(2), 327-365.
  16. ^ Наоки Кобаяси и Акинори Йонэдзава, АМЕРИКАНО-японский семинар по параллельным символьным вычислениям, 1994, 279-294.

Общие введения

Другие источники

Дальнейшее чтение

Внешние ссылки