TGViewer
Роздуми Спрощенця Роздуми Спрощенця @decomplexifier · 230 subscribers
Post #17 697
‍Продовжуємо.

Перший день у 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 constraints

true.

?- 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.

На скріншоті: поточна ітерація того, як виглядають описи пакетів.

Є питання? Пишіть!
  • 👍 6
  • 🤯 6
  • 🔥 5
More from @decomplexifier
  1. Aug 2, 2024У мене таке питання: чи є серед вас ті, хто ненавидить відлагодження SQL запитів? А як щод…
  2. Jun 14, 2024‍Тут ось яка ідея виникла: можливо іноді шукати програмістів з прямим релевантним досвідом…
  3. Oct 30, 2023‍Хвилинка самореклами. 🤡 Як ви можете пам’ятати, я Омнігресом займався з минулого року. А…
  4. Aug 26, 2023Коротка новина: нарешті зробив перший реліз досить нішевого інструмента, pg_yregress Якщо…
  5. Jul 30, 2023Я тут написав статтю про архітектуру разом з автором SQLPage і вона зараз на front page Ha…
  6. Jul 21, 2023Мене завжди дратував той факт, що для написання якоїсь бізнес-логіки на чомусь окрім SQL а…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →