I think that Nova and Ceptre work in 2 stages. (1) search, (2) do something with the matched stuff (i.e. mutate the factbase). In my mind, the basic function of Prolog is to do "exhaustive search". In function-based languages, exhaustive search would be written as nested loops. Both, Nova and Ceptre need to do exhaustive search in step (1), hence, they both need the basic exhaustive-search-function of Prolog (or bug-inviting nested loops). In step (2) they, both, need to do only very simple things - retract facts from the factbase, insert facts into the factbase.
At 2:05:26, Wryl shows syntax with dark-background text and grey-background text. I see the dark text as "constants" and the grey stuff as "holes". Prolog syntax uses lower-case for constants and Upper case for holes. Ceptre uses the same syntax and adds the "lolli" operator ("o-" in ASCII) to separate step (1) from step (2). And, Ceptre uses a circle-X ("*" in ASCII) to separate pattern matching clauses (in Prolog that would be ","). Off the cuff, I think Wryl's example is:
image(Name,X,Y,R,G,B)
palette(Color,R,G,B)
--->
image(Name, X, Y, Color)
and, would be written in Prolog as:
image(Name,X,Y,R,G,B) ,
palette(Color,R,G,B) ,
retract(image(Name,X,Y,R,G,B)),
retract(image(Name,X,Y,Color)),
assert(image(Name, X, Y, Color)).
And, in Ceptre it might be written as
image(Name,X,Y,R,G,B) * palette(Color,R,G,B) o- image(Name, X, Y, Color).
[My knee-jerk reaction would be to use t2t or OhmJS to rewrite the Ceptre syntax into Prolog syntax, then to run SWIPL on the result. Then, I would write yet another t2t program that would allow extending the Prolog-ish syntax by adding JS externals, then, spit that out as a /bin/bash pipeline (example syntax from an unrelated experiment github.com/guitarvydas/das/blob/main/das2f/layerboundingbox.md)]. [Some months ago, I dissected the Ceptre dungeon crawler example and hand-mapped it to DPL syntax: guitarvydas.github.io/2024/01/19/Ceptre-Dungeon-Crawler-Example-Walk-Through.html]