Prolog "basic"
Admin User, created Apr 06. 2025
/**
* Warranty & Liability
* To the extent permitted by applicable law and unless explicitly
* otherwise agreed upon, XLOG Technologies AG makes no warranties
* regarding the provided information. XLOG Technologies AG assumes
* no liability that any problems might be solved with the information
* provided by XLOG Technologies AG.
*
* Rights & License
* All industrial property rights regarding the information - copyright
* and patent rights in particular - are the sole property of XLOG
* Technologies AG. If the company was not the originator of some
* excerpts, XLOG Technologies AG has at least obtained the right to
* reproduce, change and translate the information.
*
* Reproduction is restricted to the whole unaltered document. Reproduction
* of the information is only allowed for non-commercial uses. Selling,
* giving away or letting of the execution of the library is prohibited.
* The library can be distributed as part of your applications and libraries
* for execution provided this comment remains unchanged.
*
* Restrictions
* Only to be distributed with programs that add significant and primary
* functionality to the library. Not to be distributed with additional
* software intended to replace any components of the library.
*
* Trademarks
* Jekejeke is a registered trademark of XLOG Technologies AG.
*/
/**
* Tested with GNU Prolog 1.5.0, Windows 10
* See also: http://www.gprolog.org/
*/
:- op(1150, fy, discontiguous).
:- op(1150, fy, dynamic).
:- op(1150, fy, multifile).
:- op(1150, fy, initialzation).
:- set_prolog_flag(strict_iso, off).
% change_arg(+Integer, +Callable, +Atomic)
change_arg(N, X, T) :- setarg(N, X, T, false).
% try_call_finally(+Goal, +Goal, +Goal)
try_call_finally(S, G, C) :-
(S; C, fail),
catch(G, E, (C, throw(E))),
(C; S, fail).
% atom_integer(-Atom, +Integer, +Integer)
atom_integer(A, R, I) :- var(A), !,
sys_unparse_integer(I, R, L, []),
atom_codes(A, L).
atom_integer(A, R, I) :-
atom_codes(A, L),
sys_parse_integer(R, I, L, []).
% sys_unparse_integer(+Integer, +Integer, -List, +List)
sys_unparse_integer(I, R) --> {I < 0}, !,
"-", {H is -I}, sys_unparse_integer2(H, R).
sys_unparse_integer(I, R) -->
sys_unparse_integer2(I, R).
% sys_unparse_integer2(+Integer, +Integer, -List, +List)
sys_unparse_integer2(I, R) --> {I < R}, !,
sys_unparse_digit(I).
sys_unparse_integer2(I, R) --> {H is I//R, D is I mod R},
sys_unparse_integer2(H, R),
sys_unparse_digit(D).
% sys_parse_integer(+Integer, -Integer, +List, -List)
sys_parse_integer(R, J) --> "-", !,
sys_parse_integer2(0, R, H),
{J is -H}.
sys_parse_integer(R, J) -->
sys_parse_integer2(0, R, J).
% sys_parse_integer2(+Integer, +Integer, -Integer, +List, -List)
sys_parse_integer2(I, R, J) --> [X],
{code_numeric(X, D),
0 =< D, D < R}, !,
{H is I*R+D},
sys_parse_integer2(H, R, J).
sys_parse_integer2(_, _, _) --> [_],
{throw(error(syntax_error(illegal_number)))}.
sys_parse_integer2(I, _, I) --> [].
% sys_unparse_digit(+Integer, -List, +List)
sys_unparse_digit(I) --> {I < 10}, !,
{C is I+0'0}, [C].
sys_unparse_digit(I) --> !,
{C is I-10+0'a}, [C].
% atom_number(-Atom, +Number)
atom_number(A, N) :- var(A), !,
number_codes(N, L),
atom_codes(A, L).
atom_number(A, N) :-
atom_codes(A, L),
number_codes(N, L).
% put_atom(+Stream, +Atom)
put_atom(S, A) :-
write(S, A).
% code_category(+Integer, -Integer)
code_category(0, 15). code_category(1, 15). code_category(2, 15). code_category(3, 15).
code_category(4, 15). code_category(5, 15). code_category(6, 15). code_category(7, 15).
code_category(8, 15). code_category(9, 15). code_category(10, 15). code_category(11, 15).
code_category(12, 15). code_category(13, 15). code_category(14, 15). code_category(15, 15).
code_category(16, 15). code_category(17, 15). code_category(18, 15). code_category(19, 15).
code_category(20, 15). code_category(21, 15). code_category(22, 15). code_category(23, 15).
code_category(24, 15). code_category(25, 15). code_category(26, 15). code_category(27, 15).
code_category(28, 15). code_category(29, 15). code_category(30, 15). code_category(31, 15).
code_category(32, 12). code_category(33, 24). code_category(34, 24). code_category(35, 24).
code_category(36, 26). code_category(37, 24). code_category(38, 24). code_category(39, 24).
code_category(40, 21). code_category(41, 22). code_category(42, 24). code_category(43, 25).
code_category(44, 24). code_category(45, 20). code_category(46, 24). code_category(47, 24).
code_category(48, 9). code_category(49, 9). code_category(50, 9). code_category(51, 9).
code_category(52, 9). code_category(53, 9). code_category(54, 9). code_category(55, 9).
code_category(56, 9). code_category(57, 9). code_category(58, 24). code_category(59, 24).
code_category(60, 25). code_category(61, 25). code_category(62, 25). code_category(63, 24).
code_category(64, 24). code_category(65, 1). code_category(66, 1). code_category(67, 1).
code_category(68, 1). code_category(69, 1). code_category(70, 1). code_category(71, 1).
code_category(72, 1). code_category(73, 1). code_category(74, 1). code_category(75, 1).
code_category(76, 1). code_category(77, 1). code_category(78, 1). code_category(79, 1).
code_category(80, 1). code_category(81, 1). code_category(82, 1). code_category(83, 1).
code_category(84, 1). code_category(85, 1). code_category(86, 1). code_category(87, 1).
code_category(88, 1). code_category(89, 1). code_category(90, 1). code_category(91, 21).
code_category(92, 24). code_category(93, 22). code_category(94, 27). code_category(95, 23).
code_category(96, 27). code_category(97, 2). code_category(98, 2). code_category(99, 2).
code_category(100, 2). code_category(101, 2). code_category(102, 2). code_category(103, 2).
code_category(104, 2). code_category(105, 2). code_category(106, 2). code_category(107, 2).
code_category(108, 2). code_category(109, 2). code_category(110, 2). code_category(111, 2).
code_category(112, 2). code_category(113, 2). code_category(114, 2). code_category(115, 2).
code_category(116, 2). code_category(117, 2). code_category(118, 2). code_category(119, 2).
code_category(120, 2). code_category(121, 2). code_category(122, 2). code_category(123, 21).
code_category(124, 25). code_category(125, 22). code_category(126, 25). code_category(127, 15).
% code_numeric(+Integer, -Integer)
code_numeric(0, -1). code_numeric(1, -1). code_numeric(2, -1). code_numeric(3, -1).
code_numeric(4, -1). code_numeric(5, -1). code_numeric(6, -1). code_numeric(7, -1).
code_numeric(8, -1). code_numeric(9, -1). code_numeric(10, -1). code_numeric(11, -1).
code_numeric(12, -1). code_numeric(13, -1). code_numeric(14, -1). code_numeric(15, -1).
code_numeric(16, -1). code_numeric(17, -1). code_numeric(18, -1). code_numeric(19, -1).
code_numeric(20, -1). code_numeric(21, -1). code_numeric(22, -1). code_numeric(23, -1).
code_numeric(24, -1). code_numeric(25, -1). code_numeric(26, -1). code_numeric(27, -1).
code_numeric(28, -1). code_numeric(29, -1). code_numeric(30, -1). code_numeric(31, -1).
code_numeric(32, -1). code_numeric(33, -1). code_numeric(34, -1). code_numeric(35, -1).
code_numeric(36, -1). code_numeric(37, -1). code_numeric(38, -1). code_numeric(39, -1).
code_numeric(40, -1). code_numeric(41, -1). code_numeric(42, -1). code_numeric(43, -1).
code_numeric(44, -1). code_numeric(45, -1). code_numeric(46, -1). code_numeric(47, -1).
code_numeric(48, 0). code_numeric(49, 1). code_numeric(50, 2). code_numeric(51, 3).
code_numeric(52, 4). code_numeric(53, 5). code_numeric(54, 6). code_numeric(55, 7).
code_numeric(56, 8). code_numeric(57, 9). code_numeric(58, -1). code_numeric(59, -1).
code_numeric(60, -1). code_numeric(61, -1). code_numeric(62, -1). code_numeric(63, -1).
code_numeric(64, -1). code_numeric(65, 10). code_numeric(66, 11). code_numeric(67, 12).
code_numeric(68, 13). code_numeric(69, 14). code_numeric(70, 15). code_numeric(71, 16).
code_numeric(72, 17). code_numeric(73, 18). code_numeric(74, 19). code_numeric(75, 20).
code_numeric(76, 21). code_numeric(77, 22). code_numeric(78, 23). code_numeric(79, 24).
code_numeric(80, 25). code_numeric(81, 26). code_numeric(82, 27). code_numeric(83, 28).
code_numeric(84, 29). code_numeric(85, 30). code_numeric(86, 31). code_numeric(87, 32).
code_numeric(88, 33). code_numeric(89, 34). code_numeric(90, 35). code_numeric(91, -1).
code_numeric(92, -1). code_numeric(93, -1). code_numeric(94, -1). code_numeric(95, -1).
code_numeric(96, -1). code_numeric(97, 10). code_numeric(98, 11). code_numeric(99, 12).
code_numeric(100, 13). code_numeric(101, 14). code_numeric(102, 15). code_numeric(103, 16).
code_numeric(104, 17). code_numeric(105, 18). code_numeric(106, 19). code_numeric(107, 20).
code_numeric(108, 21). code_numeric(109, 22). code_numeric(110, 23). code_numeric(111, 24).
code_numeric(112, 25). code_numeric(113, 26). code_numeric(114, 27). code_numeric(115, 28).
code_numeric(116, 29). code_numeric(117, 30). code_numeric(118, 31). code_numeric(119, 32).
code_numeric(120, 33). code_numeric(121, 34). code_numeric(122, 35). code_numeric(123, -1).
code_numeric(124, -1). code_numeric(125, -1). code_numeric(126, -1). code_numeric(127, -1).
% last_sub_atom(+Atom, -Integer, -Integer, -Integer, +Atom)
last_sub_atom(X, A, B, C, Y) :-
findall(A-B-C-Y, sub_atom(X, A, B, C, Y), L),
reverse(L, R),
member(A-B-C-Y, R).
% sys_check_atom(+Term)
sys_check_atom(V) :- var(V),
throw(error(instantiation_error,_)).
sys_check_atom(A) :- atom(A), !.
sys_check_atom(A) :-
throw(error(type_error(atom,A),_)).
% sys_check_integer(+Term)
sys_check_integer(V) :- var(V),
throw(error(instantiation_error,_)).
sys_check_integer(I) :- integer(I), !.
sys_check_integer(I) :-
throw(error(type_error(integer,I),_)).
% file_directory_name(+Atom, -Atom)
file_directory_name(Path, Dir) :-
(last_sub_atom(Path, Pos1, _, _, '/') -> true; Pos1 = -1),
(last_sub_atom(Path, Pos2, _, _, '\\') -> true; Pos2 = -1),
Pos is max(Pos1, Pos2),
Pos3 is Pos+1,
sub_atom(Path, 0, Pos3, _, Dir).
% file_base_name(+Atom, -Atom)
file_base_name(Path, Name) :-
atom_length(Path, Len),
(last_sub_atom(Path, _, _, Pos1, '/') -> true; Pos1 = Len),
(last_sub_atom(Path, _, _, Pos2, '\\') -> true; Pos2 = Len),
Pos is min(Pos1, Pos2),
sub_atom(Path, _, Pos, 0, Name).
% ir_object_current(+Object, +Atom, -Object)
ir_object_current(_, _, gnu).