Поиск…


замечания

Реализации

  1. SWI-Prolog (бесплатно)
    • Реализовано в
  2. SICStus (коммерческий)
  3. YAP (бесплатно)
  4. GNU Prolog (бесплатно)
  5. XSB (бесплатно)
  6. B (коммерческий)
  7. IF (коммерческий)
  8. Ciao (бесплатно)
  9. Минерва (коммерческая)
  10. ECLiPSe-CLP (бесплатно)
  11. Jekejeke Prolog (коммерческий)
  12. Пролог IV
  13. Выход Пролог (бесплатно)
  14. Визуальный пролог (коммерческий)

Установка или настройка

SWI-Prolog

Windows и Mac:

  • Скачать SWI-Prolog на официальном сайте
  • Просто установите, следуя инструкциям установщика.

Linux (PPA):

  • Добавьте PPA ppa:swi-prolog/stable к источникам программного обеспечения вашей системы (разработчики могут выбрать для ppa:swi-prolog/devel ):

    • Откройте терминал (Ctrl + Alt + T) и введите: sudo add-apt-repository ppa:swi-prolog/stable

    • Затем обновите информацию о пакете: sudo apt-get update

  • Теперь установите SWI-Prolog через диспетчер пакетов: sudo apt-get install swi-prolog

  • Теперь вы можете запустить SWI-Prolog через командную строку с командой swipl

добавление / 3

append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
    append(As, Bs, Cs).

append/3 является одним из самых известных отношений Prolog. Он определяет связь между тремя аргументами и является истинным, если третий аргумент представляет собой список, который обозначает объединение списков, указанных в первом и втором аргументах.

Примечательно, что, как и для хорошего кода Prolog, append/3 можно использовать в нескольких направлениях : его можно использовать для:

  • добавьте два полностью или частично созданных списка:

      ?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y)
      Output:
      A = [1, 2, 3],
      B = [4, 5, 6],
      Y = [1, 2, 3, 4, 5, 6].
    
  • проверьте , верно ли отношение для трех полностью созданных списков:

      ?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C)
      Output:
      false
    
  • создать все возможные способы добавления двух списков в данный список:

      ?- append(A, B, [1, 2, 3, 4]).
      Output:
      A = [],
      B = [1, 2, 3, 4] ;
      A = [1],
      B = [2, 3, 4] ;
      A = [1, 2],
      B = [3, 4] ;
      A = [1, 2, 3],
      B = [4] ;
      A = [1, 2, 3, 4],
      B = [] ;
      false.
    

Ограничения CLP (FD)

Ограничения CLP (FD) предоставляются всеми серьезными реализациями Prolog. Они позволяют нам рассуждать о целых числах чистым способом.

?- X #= 1 + 2.
X = 3.

?- 5 #= Y + 2.
Y = 3.

Программирование баз данных

Пролог классифицирует все на:

  • Атомы - любая последовательность символов, которые не начинаются с прописного алфавита. Например - a , b , okay
  • Числа - для чисел нет специального синтаксиса, объявление не требуется. Например, 1 , 22 , 35.8
  • Переменные - строка, начинающаяся с символа верхнего регистра или подчеркивания ( _ ). Например, X , Y , Abc , AA
  • Сложные термины - они сделаны из функтора и последовательности аргументов . Имя комплексного члена всегда является атомом, а аргументы могут быть либо атомами, либо переменными. Например, father(john,doe) , relative(a) , mother(X,Y) .

Логическая база данных содержит набор фактов и правил .

Сложный член с атомами в качестве аргументов называется фактом, а сложный член с переменными в качестве аргументов называется правилом.

Пример фактов в Прологе:

father_child(fred, susan).
mother_child(hillary, joe).

Пример правила в Prolog:

child_of(X,Y):-
    father_child(Y,X)
    ;
    mother_child(Y,X).

Обратите внимание, что ; здесь как оператор or на других языках.

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

Фред - отец сусан

холм - мать Джо.

Для всех X и Y X является дочерним элементом Y если Y является отцом X или Y является матери X

Фактически, конечный набор фактов и / или правил представляет собой логическую программу .

Использование такой программы демонстрируется путем выполнения запросов . Запросы позволяют извлекать информацию из логической программы.

Чтобы загрузить базу данных в интерпретатор (если вы сохранили базу данных в каталоге, в котором запущен интерпретатор), вы просто вводите:

?- [nameofdatabase].

заменив имя nameofdatabase на фактическое имя файла (обратите внимание, что здесь мы исключаем расширение .pl в имя файла).

Пример запросов в интерпретаторе для программы выше и результатов:

?- child_of(susan,fred).
true

?- child_of(joe,hillary).
true

?- child_of(fred,susan).
false

?- child_of(susan,hillary).
false

?- child_of(susan,X).
X = fred

?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.

Запросы выше и их ответы можно прочитать следующим образом:

является ли судан ребенком Фреда? - правда

является ли ребенок из холма? - правда

является ли ребенок сусан? - ложный

Сьюзан - ребенок холма? - ложный

кто является сусан ребенком? - fred

Вот как мы программируем логику в Prolog. Логическая программа более формально: набор аксиом или правил, определяющих отношения (ака предикаты) между объектами. Альтернативный способ интерпретации базы данных выше более формальным логическим способом:

Отношение father_child держится между fred и susan

Отношение mother_child относится к холмику и Джо

Для всех X и Y отношение child_of выполняется между X и Y если отношение father_child выполняется между Y и X , или отношение mother_child выполняется между Y и X

Привет, мир

Привет, Мир в интерактивном интерпретаторе

Чтобы напечатать «Привет, мир!» в интерпретаторе Prolog (здесь мы используем swipl , оболочку для SWI Prolog):

$ swipl
<...banner...>
?- write('Hello, World!'), nl.

?- это системное приглашение: оно указывает, что система готова для пользователя ввести последовательность целей (т.е. запрос ), которые должны быть прерваны с помощью . (полная остановка).

Здесь запрос write('Hello World!'), nl имеет два цели:

  • write('Hello World!') : 'Hello World!' должен отображаться и ( , )
  • должна следовать новая строка ( nl ).

write/1 (символ /1 используется, чтобы указать, что предикат принимает один аргумент), а nl/0 - встроенные предикаты (определение предоставляется заранее системой Prolog). Встроенные предикаты предоставляют средства, которые не могут быть получены с помощью чистого определения Prolog или для сохранения программиста от необходимости определять их.

Выход:

Привет, мир!

да

заканчивается на yes что означает, что запрос преуспел. В некоторых системах вместо « yes печатается true .

Привет, Мир из файла

Откройте новый файл hello_world.pl и вставьте следующий текст:

:- initialization hello_world, halt.

hello_world :-
    write('Hello, World!'), nl.

Директива initialization указывает, что цель hello_world, halt следует вызывать, когда файл загружен. halt завершает работу программы.

Затем этот файл можно выполнить с помощью исполняемого файла Prolog. Точные флаги зависят от системы Prolog. Если вы используете SWI Prolog:

$ swipl -q -l hello_world.pl 

Это даст результат Hello, World! , Флаг -q подавляет баннер, который обычно отображается, когда вы вызываете run swipl . Параметр -l указывает файл для загрузки.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow