Другой «язык искусственного интеллекта» Пролог

Язык программирования

В топ-20 только что обнародованного в августе рейтинга TIOBE попал древний язык искусственного интеллекта Prolog!

TIOBE сказал: «И, что еще более удивительно, мы видим, как Prolog снова входит в топ-20 после 15 лет... неожиданное возвращение».

TIOBE Index for August 2021

(Изображение из индекса TIOBE за август 2021 г.)

Спустя более десяти лет этот уникальный язык снова предстал перед всеми, заняв второе место после Go! Не рано учиться!

Если вы не можете выучить его, пожалуйста, следуйте по моим стопам.Сегодня мы начнем со свежего и утонченного примера, чтобы оценить этот другой «язык искусственного интеллекта».

Кроме того, мы также сделали вводное видео о Прологе, которое сопровождает эту статью, вы можете посмотреть его. Если видео было вам полезно, не забудьте нажать на три ссылки :)

воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо

(Делать видео очень утомительно. От написания сценария до музыки и монтажа я все делал сам. Давайте поддержим :)

Prolog

like(mercury, kathy).        % mercury 喜欢 kathy。
like(kathy, mercury).        % kathy 喜欢 mercury。

lover(X, Y) :- like(X, Y), like(Y, X).        % 如果X喜欢Y,且Y也喜欢X,则X与Y是恋人。


询问mercury和谁是恋人:lover(mercury, Who).
电脑告诉我 Who = kathy,

这就是Prolog!

(Этот текст взят с древнего веб-сайта, который существует до сих пор.Пролог Язык искусственного интеллекта Китайский форумвидное место на главной странице)

Это очень глубокое стихотворение! Но вам может быть трудно представить, что это на самом деле «язык программирования».

Оглядываясь назад на развитие языков программирования, можно выделить несколько периодов.

  • Язык программирования первого поколения: машинный язык, использующий 0 и 1 для написания кода (давно утерянный магический навык, который показал нам Велд Вуди).
  • Язык программирования второго поколения: язык ассемблера
  • Языки программирования третьего поколения: языки высокого уровня, репрезентативные работы C, Java, C++, C#
    • 3.5 GL: Позднее третье поколение, такое как Python, Lisp1, уровень абстракции выше, а там уже тень четвертого поколения.
  • Язык программирования четвертого поколения: более высокий уровень абстракции, без учета деталей, связанных с аппаратным обеспечением, с упором на описание проблем и решение проблем, таких как SQL, MATLAB.

Возможно, на этом понимание языков программирования маленькими друзьями заканчивается. Но на самом деле у нас это было несколько десятилетий назад…

  • Язык программирования пятого поколения.: язык искусственного интеллекта, это поколение языков программирования ожидает, что компьютер автоматически решит проблему, основываясь на определенных ограничениях, заданных проблемой, и передаст ее программе, чтобы справиться с ней, не требуя от программистов вкладывать средства в рабочую силу для разработки программ.

Когда вы сегодня говорите «искусственный интеллект», вы должны думать о Python, но Python — это не язык искусственного интеллекта пятого поколения. Пролог — один из языков программирования пятого поколения, который уже более десяти лет находится в упадке.

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

Prolog

Слово Пролог происходит от PROgramming от LOGic, что означает логическое программирование. Пролог не требует, чтобы вы писали процесс запуска программы, вам нужно только указать факты и правила, и он автоматически проанализирует логическую связь. Затем вы можете попросить Пролог выполнить сложные логические операции с помощью запросов.

SWI-Prolog

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

Здесь мы используемSWI-Prolog- Очень полная реализация с открытым исходным кодом, которая все еще разрабатывается и поддерживается. В macOS вы можете использоватьbrewУстановите SWI-пролог:

$ brew install swi-prolog

Также доступен Linux на базе Debianapt-getчтобы легко завершить установку. Другие системы могут пойтиСтраница загрузки официального сайтаНайдите соответствующие двоичные файлы или соберите их из исходного кода.

Если вы не хотите или затрудняетесь завершить установку, у SWI-Prolog она есть для вас.онлайн-версия.

После завершения установки пройдитеswiplКоманда входит в среду SWI-Prolog REPL, похожую на Python (приглашение для SWI-Prolog?-):

$ swipl
?- 

Международная практика, сначала напишите Hello World:

?- write('Hello, World!').
Hello, World!    % write 打印的结果
true.            % 返回值

Обратите внимание, что операторы Пролога заканчиваются на.конец.

Чтобы выйти из SWI-Prolog, нажмитеControl-Dили введитеhalt.. (Вы можете сделать это, набравapropos(quit).чтобы найти тему о «выходной» остановке, затем используйтеhelp(halt).Смотри как выйти)

Основной синтаксис Пролога

В отличие от других языков программирования на основе переменных, с которыми мы обычно сталкиваемся, Пролог основан на

  • Факты: Факты
  • Правила: Правила
  • Запросы: запрос

Эти понятия буквальны, например

  • факт:11 不能被 2 整除。
  • правило:不能被 2 整除的数是奇数。
  • Спросите:11 是奇数吗?
    • Результат (ответ):11 是奇数。

в Прологефактиправилои вместе образуют базу знаний, мы пишем эти два в суффиксе имени.plв файле.

ЗапросНаписано на REPL, основано на известной базе знаний, логически рассуждает о вопросе и дает ответ.

факт

Например, предположим, что мы знаем некоторые факты (буквально), что:

  • Ёмоги и Юмэ нравятся друг другу;
  • Канейши также любит Ёмоги.

В Прологе эти факты представлены как:

like(yomogi, yume).
like(yume, yomogi).
like(kaneishi, yomogi).

Мы можем записать это в./ssss.plфайлы, но не в REPL.

В Прологенижний регистрСлова, начинающиеся с букв,постоянный, представляющий такой объект, какlike,mercury,kathyНет необходимости предварительно определять, не требуется никакого назначения, просто напишите его напрямую.

Обратите внимание, что симпатия к такого рода вещам односторонняя. То, что нравится Б, не означает, что В любит А (например, канейси и ёмоги), поэтому, чтобы выразить, что ёмоги и юмэ похожи друг на друга, нужно написать два предложения.

мы кладемlikeназываетсясвязь, то есть представляя какую-то взаимную связь между двумя или более предметами, мы можем также определить факт, относящийся только к одному предмету, этот факт называетсяАтрибуты:

male(yomogi).
female(yume).
female(kaneishi).

правило

Теперь составим правило:

  • Если X любит Y, а Y любит X, то X и Y любовники.

Правила выражаются на Прологе какhead :- goals, то есть когда цели установлены, устанавливается и голова.

lover(X, Y) :- like(X, Y), like(Y, X).

(Эта строка кода также пишет./ssss.plсередина)

Эта строка кода означает, что еслиlike(X, Y)иlike(Y, X)устанавливаются, то естьlover(X, Y)учредил. Выражено на языке Python:

def lover(X, Y):
    return like(X, Y) and like(Y, X)

ИЛИ и НЕ в Прологе:

  • A, Bозначает "АиБ”
  • A; Bозначает "АилиБ”
  • \+ AВыражать"НетА”

Запрос

Предыдущие факты и правила являются определениями, то есть мы сообщаем Прологу что-то известное. Запросы — это самое важное, то есть пусть Пролог помогает нам решать логические задачи.

использоватьswiplв среду Prolog, затем используйтеconsult("path/to/xxx.pl")нагрузка написана в.plКод в файле для чтения известных условий:

$ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.4)
?- consult('ssss.pl').
true.

Кроме того, вы также можете использовать[xxx].этот синтаксис для загрузкиxxx.pl.

Затем, если мы хотим узнать, любит ли ёмоги юмэ, мы можем спросить у Пролога:

like(yomogi, yume).
true.

результатtrueвыражатьlike(yomogi, yume)т.е. ёмоги вроде юмэ настроил. и:

?- like(yomogi, kaneishi).
false.

?- like(yomogi, gauma).
false.

falseЭто означает, что ёмоги не любит канеиси, и, конечно же, невинные ёмоги еще менее склонны любить гауму, незнакомца, которого мы не определили.

Первые несколько запросов спрашивают, установлена ​​ли связь, то есть, чтобы увидеть, существует ли «факт». при объединении определенныхloverправил, Пролог также может:

?- lover(yomogi, yume).
true.

?- lover(yume, yomogi).
true.

?- lover(yomogi, kaneishi).
false.

?- lover(kaneishi, yume).
false.

Через известное подобное отношение (факт) в сочетании с нашим определением любовника (правило) Пролог может рассуждать:

  • Ёмоги и Юмэ - любовники. Конечно, верно и обратное утверждение «юмэ и ёмоги — любовники».
  • Поскольку ёмоги не любит канейши, ёмоги и канейши не любовники!
  • Ни у Юмэ, ни у Канейши нет отношений, которые нравятся обеим сторонам, так что они тоже не любовники.

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

Например, мы хотим знатьпонгКто любит ёмоги? Просто спросите Пролог:

?- like(yomogi, Who).
Who = yume.

здесьWhoявляется переменной, Пролог решит переменную в запросе, и результат здесьWho = yume, что означает, что ёмоги любит юмэ.

То, что Prolog делает здесь, фактически решает уравнение и получает значения переменных, которые делают результат запроса верным:like(yomogi, Who) = trueполучитьWho=?.

в ПрологекапиталСлова, начинающиеся с букв, являются переменными. (Обратите внимание, что переменные в Прологе пишутся с заглавной буквы, а константы — строчными, что противоречит нашим обычным привычкам программирования на языке C.) Если вы пишете в неправильном регистре, смысл неверен. Попробуйте выполнить запрос:

?- like(yomogi, who).
false.    % yomogi 不喜欢 who 这个人,咱也不知道 who 是谁

Если мы хотим запросить «Нравится ли юмэ ёмоги» и написать юмэ как Юмэ в верхнем регистре, это станет запросом «кто любит ёмоги»:

?- like(Yume, yomogi).    % Yume 是个变量,不是 yume 这个人
Yume = yume ;             % 摁 tab 键或摁 ; 键显示下一个结果
Yume = kaneishi.

Здесь Yume равно Who, что является просто переменной для людей, которым нравятся ёмоги, а неюжный одноклассникЧеловек юмэ в предыдущем определении. Исходя из того, что мы определили в начале, и юмэ, и канейси похожи на ёмоги, поэтому здесь Юмэ (Кто) может быть либо юмэ, либо канейси.

Для этого типа запроса с несколькими результатами. SWI-Prolog по умолчанию отображает только один результат за раз, а затем подождите, нам нужно нажать;(означает «или», помните), а затем отображает следующий результат. (Вы также можете нажать здесьtabключ)

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

?- listing(like).
like(yomogi, yume).
like(yume, yomogi).
like(kaneishi, yomogi).
    
?- listing(lover).
lover(X, Y) :-
    like(X, Y),
    like(Y, X).

Пример: Умрет ли Сократ?

Используя предыдущие знания, можно решить многие логические задачи, например, известно, что:

  • Сократ - человек
  • все умрут

Так что можно отказаться от вывода: Сократ умрет.

Используйте Prolog для решения этой проблемы:

person(socrates).       % 事实
mortal(X) :- person(X). % 规则

---
% 查询

?- mortal(socrates).    % 苏格拉底会死吗
true.
    
?- mortal(X).           % 谁会死
X = socrates

Если вы считаете, что полная программа может не только включать в себя логические операции, но также должна иметь ввод и вывод, то в сочетании с write in hello world мы можем добиться:

person(socrates).
person(plato).
person(aristotle).

mortal(X) :- person(X).

mortal_report :- 
    write('Known mortals are:'), nl, mortal(X), write(X), nl.  % nl 是换行

Затем вызовите интерпретатор:

?- mortal_report.
socrates
plato
aristotle

Это получает некоторых смертных с ограниченными жизнями.

Используя это «логическое программирование», вы также можете написать более интересные примеры. Если вы чувствуете, что этот пример уже непонятен, то я рекомендую вам заново изучить основы математической логики (глава 1 многих книг по дискретной математике).


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

Ссылаться на

[1] Blackburn, Patrick and Bos, Johan and Striegnitz, Kristina. Learn Prolog Now!. College Publications. 2006

[2] Жуань Ифэн.Введение в язык ПрологБлог Жуань Ифэн, 2019 г.

[3] SWI Prolog. Getting Started.

[4] Draveness. Основы Пролога . draveness.me, 2015

[5] Автор неизвестен. Вводный курс по Прологу. Рыбалка и прослушивание Чжусюань. 2004 г.

(Последняя статья — это статья, которую я читал, когда изучал Пролог почти 10 лет назад. Она очень проста для понимания. Но сейчас в Интернете есть только несколько перепечаток этой статьи и оригинальный английский перевод этой статьи. трудно найти этот драгоценный китайский перевод, в настоящее время я только что обнаружил, что он может быть с веб-сайта под названием Ding Diao Ting Zhu Xuan, но этот веб-сайт закрыт, резервные копии в archive.org все с ошибками 3xx, я буду делать больше археологии когда у меня будет время)


  1. Лисп: Некоторые источники говорят, что Лисп — это язык программирования пятого поколения, но из Лиспа, который я изучил, Лисп не соответствует определению пятого поколения, но язык пятого поколения может быть реализован с помощью Лиспа.