:- op(600, xfx
, :=). % Define a custom infix operator.
% Predicate 1: The 'main' goal.
% It uses a failure-driven loop, which executes the side-effect
% (printing) and then fails the whole goal.
cursed_hello :-
\+ (
hello_world := [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33],
print_to_stderr(hello_world),
fail % Force failure *after* printing ).
% Predicate 2: Hides the actual printing logic.
% It takes advantage of the term unification performed by the custom operator.
print_to_stderr(Term := Codes) :-
% Term is ignored, Codes contains the list of ASCII values.
% string_codes/2 converts the list of numbers into an actual string.
string_codes(String, Codes),
% write_term/2 is used with the 'quoted(false)' option to print the string
% value instead of the string's representation (e.g., "Hello, World!").
nl(user_error
). % Write newline to the error stream
% Query:
% ?- cursed_hello.
% Hello, World!
% false.
Oi0gb3AoNjAwLCB4ZngsIDo9KS4gJSBEZWZpbmUgYSBjdXN0b20gaW5maXggb3BlcmF0b3IuCgolIFByZWRpY2F0ZSAxOiBUaGUgJ21haW4nIGdvYWwuCiUgSXQgdXNlcyBhIGZhaWx1cmUtZHJpdmVuIGxvb3AsIHdoaWNoIGV4ZWN1dGVzIHRoZSBzaWRlLWVmZmVjdCAKJSAocHJpbnRpbmcpIGFuZCB0aGVuIGZhaWxzIHRoZSB3aG9sZSBnb2FsLgpjdXJzZWRfaGVsbG8gOi0KICAgIFwrICgKICAgICAgICBoZWxsb193b3JsZCA6PSBbNzIsIDEwMSwgMTA4LCAxMDgsIDExMSwgNDQsIDMyLCA4NywgMTExLCAxMTQsIDEwOCwgMTAwLCAzM10sCiAgICAgICAgcHJpbnRfdG9fc3RkZXJyKGhlbGxvX3dvcmxkKSwKICAgICAgICBmYWlsICUgRm9yY2UgZmFpbHVyZSAqYWZ0ZXIqIHByaW50aW5nCiAgICApLgogICAgCiUgUHJlZGljYXRlIDI6IEhpZGVzIHRoZSBhY3R1YWwgcHJpbnRpbmcgbG9naWMuCiUgSXQgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSB0ZXJtIHVuaWZpY2F0aW9uIHBlcmZvcm1lZCBieSB0aGUgY3VzdG9tIG9wZXJhdG9yLgpwcmludF90b19zdGRlcnIoVGVybSA6PSBDb2RlcykgOi0KICAgICUgVGVybSBpcyBpZ25vcmVkLCBDb2RlcyBjb250YWlucyB0aGUgbGlzdCBvZiBBU0NJSSB2YWx1ZXMuCiAgICAlIHN0cmluZ19jb2Rlcy8yIGNvbnZlcnRzIHRoZSBsaXN0IG9mIG51bWJlcnMgaW50byBhbiBhY3R1YWwgc3RyaW5nLgogICAgc3RyaW5nX2NvZGVzKFN0cmluZywgQ29kZXMpLAogICAgJSB3cml0ZV90ZXJtLzIgaXMgdXNlZCB3aXRoIHRoZSAncXVvdGVkKGZhbHNlKScgb3B0aW9uIHRvIHByaW50IHRoZSBzdHJpbmcKICAgICUgdmFsdWUgaW5zdGVhZCBvZiB0aGUgc3RyaW5nJ3MgcmVwcmVzZW50YXRpb24gKGUuZy4sICJIZWxsbywgV29ybGQhIikuCiAgICB3cml0ZV90ZXJtKHVzZXJfZXJyb3IsIFN0cmluZywgW3F1b3RlZChmYWxzZSldKSwKICAgIG5sKHVzZXJfZXJyb3IpLiAlIFdyaXRlIG5ld2xpbmUgdG8gdGhlIGVycm9yIHN0cmVhbQogICAgCiUgUXVlcnk6CiUgPy0gY3Vyc2VkX2hlbGxvLgolIEhlbGxvLCBXb3JsZCEKJSBmYWxzZS4K