我在Prolog中难以理解“树”遍历的概念。
给出一个输入列表,如果叶子中存在原子(忽略函子),则以下代码将hi替换为hi。我在让我感到困惑的部分旁边添加了%的注释:
replace([],[]).
replace([H | T], [H1 | T1]):-
( H == hi -> H1 = bye;
replace(H, H1) % P1: What exactly does replace (H,H1) do? I know that
% is saying if H = hi then H1 = bye; else ..
),
replace(T, T1).
% The rule below is called in the replace(H,H1) above as well as the replace(T,T1).
% I am unsure as to what exactly this does.
replace(L, R):-
L =.. [F1 | Args1],
replace(Args1, Args2),
R =.. [F1 | Args2].
上面的代码输出:
?- replace(put(hi,table,aside(hi(dont,replace),hi)),X).
X = put(bye, table, aside(hi(dont, replace), bye))
我将不胜感激。预先感谢。
replace / 2的第二个子句适用于运算符=..,由于历史原因,它也被称为-univ,然后尝试替换其arguments,并且至少总是重新组合术语统一手段如果还要替换函子,则只需简化以下子句:
replace(L, R):-
L =.. In,
replace(In, Out),
R =.. Out.
由于Prolog具有relational数据模型,所以有时输入/输出区分无济于事,无论如何它只是一个命名约定。重要的是参数的instantiation模式。内置谓词(通常是一个例子)通常会尝试提供最灵活的模型,也就是说,它们可以工作[[backwards,但此功能并非总是可行的。