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).
同样,这一个留作练习。
我是 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).
同样,这一个留作练习。