Prolog概念-使用递归替换原子

问题描述 投票:0回答:1

我在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)) 

我将不胜感激。预先感谢。

prolog traversal functor swi-prolog
1个回答
0
投票

replace / 2的第二个子句适用于运算符=..,由于历史原因,它也被称为-univ,然后尝试替换其arguments,并且至少总是重新组合术语统一手段如果还要替换函子,则只需简化以下子句:

replace(L, R):-
    L =.. In,
    replace(In, Out),
    R =.. Out.

由于Prolog具有relational数据模型,所以有时输入/输出区分无济于事,无论如何它只是一个命名约定。重要的是参数的instantiation模式。内置谓词(通常是一个例子)通常会尝试提供最灵活的模型,也就是说,它们可以工作[[backwards,但此功能并非总是可行的。

© www.soinside.com 2019 - 2024. All rights reserved.