Перший день у Prolog був найважчим, адже кожні пʼять хвилин я намагався використовувати REPL (toplevel) щоб писати предикати прямо у запиті (без секції
[user].). Втім, варто запам’ятати, що у цій штуці ми ставимо питання. А всі дефініції або у файлі, або [user]. % тут щось описано^DПісля усвідомлення цього, поїхало краще. Головна ідея, яка мені дуже подобається (принаймні, для певного класу проблем), це те, що правила описують “якщо X, то Y” і можна фокусуватись на результаті, а не на процесі його досягнення. Ми описуємо по суті відносини між речами. От простий приклад:
?- length([1,2,3], L).L = 3.Тут, в принципі, все просто. Дали список, отримали довжину. Але все не так просто:
?- length([1,2,3], 3).true.?- length([1,2,3], 4).false.Тут ми бачимо, що насправді ми запитали, чи є довжина списку такою, як ми вказали (просто
L у прикладі – це змінна без значення). Більше того, ми можемо давати складні умови з обмеженнями:?- use_module(library(clpfd)). % бібліотека для integer constraintstrue.?- L #< 4 #\/ L #>6 , length([1,2,3], L).L = 3.?- L #< 4 #\/ L #>6 , length([1,2,3,4,5,6], L).false.?- L #< 4 #\/ L #>6 , length([1,2,3,4,5,6,7], L).L = 7.Але навіть це ще не все, ми можемо згенерувати список заданої довжини:
?- length(List, 5).List = [_, , , , ].?- L #< 4 #\/ L #>6 , length(List, L).L = 0,List = [] ;L = 1,List = [_] ;L = 2,List = [_, _] ;L = 3,List = [_, _, _] ;L = 7,List = [_, _, _, _, _, _, _] ;...Там ще дуже багато цікавого, але в мене тут простору не вистачить 😄. Отже, це дуже цікавий інструмент для того щоб описувати складні системи. Мене дуже тішить, коли досить складні проблему описуються дуже лінійно завдяки тому що предикати можуть дати більш ніш одну відповідь (non-deterministic predicates).
Я вирішив поки що зупинитись на SWI Prolog, але є ще багато цікавих імплементацій, як відкритих, так і комерційних. SWI має багато фіч, та його досить легко додати до програм на C/Rust/т.і. програми (я навіть почав розробляти plprolog бо це буде дуже цікавий інструмент для експертних систем у постгресі). Після кількох тижнів з “чистим” прологом я перейшов на Logtalk для того щоб краще організувати мій код. Рекомендую: автор вже на протязі більш ніж 20 років працює над ним, і робить це дуже активно.
Чи варто спробувати Prolog? Так, абсолютно! Щонайменше, це дасть можливість подивитися на проблеми під іншим кутом. Власне, сама мова дуже мінімалістична і можна будувати прототипи та реальні системи досить швидко. Дуже рекомендую лекції Power of Prolog.
На скріншоті: поточна ітерація того, як виглядають описи пакетів.
Є питання? Пишіть!