Prolog 中的引用传递示例

Example of pass by reference in Prolog

我是 Prolog 的新手,我找不到关于 Prolog 中引用传递如何工作的资源。我在这里测试了一个程序来显示变量的地址,但我认为在序言中实例化是必须的。

 test(Z):-
    write(Z).
 main:-
    X,
    test(X).

有没有办法让这段代码生效?在 Prolog 中显示传递引用。

试试这个。定义一个具有单个“输出变量”的谓词并将其设置在谓词中:

my_predicate(5). % sets the variable to 5

现在称呼它:

?- my_predicate(X).
X = 5.

很好,很有效。


现在忘掉 按值传递, 按引用传递,更重要的是,变量 addresses。当您谈论 Prolog 时,这不是正确的术语。你有逻辑变量、变量实例化、统一、不变性等等。

来自评论

both would have the address of 2500.

你描述的其实是两个不同变量的统一,然后统一。


示例

?- format('~w,~w~n',[X,Y]),X=Y,format('~w,~w~n',[X,Y]).
_11326,_11332
_11326,_11326
X = Y.

注意统一之前X=Y
X 的地址为 _11326,Y 的地址为 _11332,两者不同

以及统一后

X 的地址为 _11326,Y 的地址为 _11326,现在相同。


编辑

这里是您的示例代码,稍作修改以尝试展示您所寻求的内容,但正如它所展示的那样,它并未展示两个不同变量的统一。

check :-
    % X,  % This will cause an error because X is not bound to a callable predicate.
    format('X @1: ~w~n',[X]),
    test(X),
    format('X @4: ~w~n',[X]),
    true.

check(X) :-
    format('X @1: ~w~n',[X]),
    test(X),
    format('X @4: ~w~n',[X]),
    true.

test(Z):-
    format('Z @2: ~w~n',[Z]),
    write(Z),
    format('~nZ @3: ~w~n',[Z]),
    true.

示例运行

?- check.
X @1: _8372
Z @2: _8372
_8372
Z @3: _8372
X @4: _8372
true.

?- check(A).
X @1: _9446
Z @2: _9446
_9446
Z @3: _9446
X @4: _9446
true.

换句话说,我认为您不会从您使用的示例代码中找到答案。


编辑

示例使用 SWI-Prolog 和 trace/0 查看正在传递的变量,与另一个变量统一并返回与起始地址不同的地址。 trace/0 的优点是无需访问变量即可显示变量的地址,例如format/2.

注意:下面的两个示例代码都使用 X 作为单例变量。这预计会给出一个编译警告。不要像预期和期望的那样修复。

代码

check_1(Y) :-
    test_1(X,Y).

test_1(X,Y) :-
    X = Y.

示例运行

?- visible(+all).

?- trace.
true.

[trace]  ?- check_1(A).
   Call: (10) example:check_1(_101582) ? creep
   Unify: (10) example:check_1(_101582)
   Call: (11) example:test_1(_103590, _101582) ? creep
   Unify: (11) example:test_1(_104356, _101582)
   Call: (12) _105066=_101582 ? creep
   Exit: (12) _101582=_101582 ? creep
   Exit: (11) example:test_1(_101582, _101582) ? creep
   Exit: (10) example:check_1(_101582) ? creep
true.

走过痕迹并理解它作为练习。如果有人需要问一个关于这个的问题开始一个新问题,不要在这里问因为这个问题有一个公认的答案。

另一个代码示例。

check_2(Y) :-
    test_2(X,Y).

test_2(X,X).

同样,这一个留作练习。