Расширение предложений Prolog без параметров - PullRequest
2 голосов
/ 03 февраля 2020

Я пишу программу, которая преобразует другие программы, расширяя предикаты. Я обычно делаю это, используя clause/2,, но он не всегда расширяет предикат, если у него нет параметров:

:- set_prolog_flag('double_quotes','chars').
:- initialization(main).

main :- clause(thing,C),writeln(C).
% this prints "true" instead of "A = 1"

thing :- A = 1.

Возможно ли расширить предикаты, которые не имеют параметров?

1 Ответ

1 голос
/ 03 февраля 2020

Некоторые общие замечания: обратите внимание, что этот код строго определен c для SWI. В других системах, соответствующих ISO, вы можете получить доступ к определениям только через clause/2, если этот предикат имеет значение dynamic.

Для SWI скажите listing., чтобы увидеть, что происходит.

?- assert(( thing :- A = 1 )).
true.

?- listing(thing).
:- dynamic thing/0.

thing.

true.

?- assert(( thing :- p(A) = p(1) )).
true.

?- assert(( thing(X) :- Y = 2 )).
true.

?- listing(thing).
:- dynamic thing/0.

thing.
thing :-
    p(_)=p(1).

:- dynamic thing/1.

thing(_).

true.

Все это похоже на небольшую оптимизацию на уровне источника.

...