In my opinion, combining both {}-based string interpolation and backticks, a feature of Jev and other decision models for referring to components of structured state arguments, would be useful for developers.
Also, I have enjoyed rapidly prototyping some SWI-Prolog for experimentation purposes, using Ollama and a model named “nimble”. As interesting, here is some source code:
:- use_module(library(http/http_client)).
:- use_module(library(http/http_json)).
:- use_module(library(json)).
:- use_module(library(json_convert)).
noul(M, Q, S, P) :- http_post("http://localhost:11434/v1/systemone", json(_{model:M, state:S, questions:_{q: _{type:"noul", instructions:Q}}}), Y, [request_header('Content-Type'='application/json'), json_object(dict)]), P = Y.answers.q.noul .
choice(M, Q, S, C, R, P) :- http_post("http://localhost:11434/v1/systemone", json(_{model:M, state:S, questions:_{q: _{type:"choice", instructions:Q, criteria:C}}}), Y, [request_header('Content-Type'='application/json'), json_object(dict)]), R = Y.answers.q.choice, P = Y.answers.q.confidence .
mentions(S, T) :- noul("nimble", "Does `s` mention `t`?", _{s:S, t:T}, P), P > 0.5 .
paraphrase(A, B) :- noul("nimble", "Is `a` a paraphrase of `b`?", _{a:A, b:B}, P), P > 0.5 .
entails(E, C) :- E = [], string(C), !, noul("nimble", "Is the statement `c` a tautology?", _{c:C}, P), P > 0.5 .
entails(E, C) :- E = [F], string(C), string(F), !, noul("nimble", "Does the statement `e` entail the claim `c`?", _{e:F, c:C}, P), P > 0.5 .
entails(E, C) :- E = [_|_], string(C), !, noul("nimble", "Do the statements `e` entail the claim `c`?", _{e:E, c:C}, P), P > 0.5 .
entails(E, C) :- string(E), string(C), !, noul("nimble", "Does the statement `e` entail the claim `c`?", _{e:E, c:C}, P), P > 0.5 .
example(T, L) :- choice("nimble", "Which label fits this ticket?", T, _{billing: "Payments and refunds.", bug: "Software errors.", account: "Login and account access."}, L, P), P > 0.5 .
Thank you for that hyperlink to deepclause. I will take a closer look!