UnifyWeaver

Appendix A: API Reference

Complete reference for the Prolog target API.

Module: prolog_target

Location: src/unifyweaver/targets/prolog_target.pl

Main Entry Points

generate_prolog_script/3

Generate a complete Prolog script from predicates.

Signature:

generate_prolog_script(+UserPredicates, +Options, -ScriptCode)

Arguments:

Options:

Example:

?- generate_prolog_script([factorial/2],
                         [dialect(gnu), compile(true), entry_point(test)],
                         Code).
Code = '#!/usr/bin/env gprolog --consult-file\n\n% Generated by...'

Throws:


write_prolog_script/2

Write generated script to file.

Signature:

write_prolog_script(+ScriptCode, +OutputPath)

Arguments:

Side Effects:

Example:

?- write_prolog_script(Code, 'my_script.pl').
true.

write_prolog_script/3

Write script with compilation support.

Signature:

write_prolog_script(+ScriptCode, +OutputPath, +Options)

Arguments:

Options:

Example:

?- write_prolog_script(Code, 'test.pl',
                       [dialect(gnu), compile(true)]).
[PrologTarget] Generated script: test.pl
[PrologTarget] Compiling with gnu: gplc --no-top-level test.pl -o test
[PrologTarget] Compilation complete
true.

analyze_dependencies/2

Analyze predicate dependencies.

Signature:

analyze_dependencies(+Predicates, -Dependencies)

Arguments:

Dependency Types:

Example:

?- analyze_dependencies([process_data/2], Deps).
Deps = [
    module(unifyweaver(core/partitioner)),
    ensure_loaded(unifyweaver(core/partitioners/fixed_size)),
    plugin_registration(partitioner, fixed_size, fixed_size_partitioner)
].

Compilation Predicates

compile_script/2

Compile script using dialect compiler (with error checking).

Signature:

compile_script(+Dialect, +ScriptPath)

Arguments:

Behavior:

Throws:

Example:

?- compile_script(gnu, 'test.pl').
[PrologTarget] Compiling with gnu: gplc --no-top-level test.pl -o test
[PrologTarget] Compilation complete
true.

compile_script_safe/3

Compile with graceful error handling.

Signature:

compile_script_safe(+Dialect, +ScriptPath, +Options)

Arguments:

Options:

Behavior:

Example:

% Lenient (default)
?- compile_script_safe(gnu, 'test.pl', []).
[PrologTarget] WARNING: gnu compilation failed (exit 1)
[PrologTarget] Continuing with interpreted script: test.pl
true.

% Strict
?- compile_script_safe(gnu, 'test.pl', [fail_on_compile_error(true)]).
ERROR: compilation_failed(gnu, 1)

Helper Predicates

generate_main_predicate/2

Generate main/0 entry point.

Signature:

generate_main_predicate(+Options, -MainCode)

Options:

Example:

?- generate_main_predicate([entry_point(test)], Code).
Code = 'main :-\n    test,\n    halt(0).\n\nmain :-\n    format(user_error, \'Error: Execution failed~n\', []),\n    halt(1).'

Module: prolog_dialects

Location: src/unifyweaver/targets/prolog_dialects.pl

Dialect Information

supported_dialect/1

Check if dialect is supported.

Signature:

supported_dialect(?Dialect)

Example:

?- supported_dialect(gnu).
true.

?- supported_dialect(eclipse).
false.

?- supported_dialect(D).
D = swi ;
D = gnu.

dialect_capabilities/2

Get dialect capability list.

Signature:

dialect_capabilities(+Dialect, -Capabilities)

Capabilities:

Example:

?- dialect_capabilities(gnu, Caps).
Caps = [
    name('GNU Prolog'),
    compilation(compiled),
    constraint_solver(fd),
    module_system(basic)
].

Code Generation

dialect_shebang/2

Generate shebang line.

Signature:

dialect_shebang(+Dialect, -ShebangLine)

Example:

?- dialect_shebang(swi, Shebang).
Shebang = '#!/usr/bin/env swipl'.

?- dialect_shebang(gnu, Shebang).
Shebang = '#!/usr/bin/env gprolog --consult-file'.

dialect_header/3

Generate script header.

Signature:

dialect_header(+Dialect, +Options, -HeaderCode)

Options:

Example:

?- dialect_header(gnu, [predicates([factorial/2])], Header).
Header = '% Generated by UnifyWeaver v0.1\n% Target: Prolog (GNU Prolog)\n% ...'

dialect_imports/3

Generate import statements.

Signature:

dialect_imports(+Dialect, +Dependencies, -ImportCode)

Example:

?- dialect_imports(swi,
                   [module(unifyweaver(core/partitioner))],
                   Imports).
Imports = ':- use_module(unifyweaver(core/partitioner)).'

dialect_initialization/4

Generate initialization code.

Signature:

dialect_initialization(+Dialect, +EntryGoal, +Options, -InitCode)

Options:

Example:

% GNU Prolog - compiled
?- dialect_initialization(gnu, test, [compile(true)], Init).
Init = '% Entry point (for compiled binary)\n:- initialization(test).'.

% GNU Prolog - interpreted
?- dialect_initialization(gnu, test, [compile(false)], Init).
Init = '% Entry point (called on load)\n:- test.'.

% SWI-Prolog
?- dialect_initialization(swi, test, [], Init).
Init = ':- initialization(test, main).'.

dialect_compile_command/3

Get compiler command for dialect.

Signature:

dialect_compile_command(+Dialect, +ScriptPath, -Command)

Example:

?- dialect_compile_command(gnu, 'test.pl', Cmd).
Cmd = 'gplc --no-top-level test.pl -o test'.

Validation

validate_for_dialect/3

Check code compatibility with dialect.

Signature:

validate_for_dialect(+Dialect, +Predicates, -Issues)

Issues: List of incompatibility descriptions

Example:

?- validate_for_dialect(gnu, [http_server/1], Issues).
Issues = [unsupported_feature(http, 'GNU Prolog lacks HTTP support')].

?- validate_for_dialect(swi, [factorial/2], Issues).
Issues = [].

Common Patterns

Pattern 1: Simple Script Generation

% Load module
:- use_module(prolog_target).

% Generate
generate_and_write(Predicates, OutputPath) :-
    generate_prolog_script(Predicates, [], Code),
    write_prolog_script(Code, OutputPath).

Pattern 2: Compiled Binary

generate_binary(Predicates, BinaryName) :-
    generate_prolog_script(
        Predicates,
        [dialect(gnu), compile(true)],
        Code
    ),
    write_prolog_script(
        Code,
        BinaryName,
        [dialect(gnu), compile(true)]
    ).

Pattern 3: Multi-Dialect

generate_both(Predicates, BaseName) :-
    % SWI version
    generate_prolog_script(Predicates, [dialect(swi)], SwiCode),
    atom_concat(BaseName, '_swi.pl', SwiPath),
    write_prolog_script(SwiCode, SwiPath),

    % GNU version
    generate_prolog_script(Predicates, [dialect(gnu)], GnuCode),
    atom_concat(BaseName, '_gnu.pl', GnuPath),
    write_prolog_script(GnuCode, GnuPath).

Pattern 4: With Validation

safe_generate(Predicates, Dialect, Code) :-
    % Validate first
    validate_for_dialect(Dialect, Predicates, Issues),
    (   Issues = []
    ->  % Valid - generate
        generate_prolog_script(Predicates, [dialect(Dialect)], Code)
    ;   % Invalid - report
        format('Incompatible with ~w: ~w~n', [Dialect, Issues]),
        fail
    ).

Error Reference

Common Errors

Error Cause Solution
unsupported_dialect(D) Unknown dialect Use swi or gnu
predicate_not_found(P/A) Predicate doesn’t exist Define predicate first
compilation_failed(D, E) Compiler error Check compiler output
firewall_denied(Op) Policy violation Update firewall policy

Exit Codes (Compilation)

Code Meaning
0 Success
1 Syntax error
127 Compiler not found

Version: UnifyWeaver v0.1 Last Updated: 2025-11-17