【发布时间】:2016-09-12 15:18:59
【问题描述】:
我正在做一些过去的试卷以备考试,我遇到了一个我不太确定如何解决的问题:
我知道我必须使用“univ”函数将术语分解为一个列表,然后递归遍历该列表并检查列表中的任何元素是否等于我们要替换的术语。但是,当列表包含另一个我们必须进一步分解的复杂术语时,我对双重递归有点迷失了。到目前为止,我的尝试如下:
complexTerm(X) :- nonvar(X), functor(X, _, A), A > 0.
replace(Term, Subterm, Subterm1, Term1) :-
Term =.. [H|T],
replaceSub([H|T], Subterm, Subterm1, Term1)
replaceSub([], Subterm, Subterm1, Term1).
replaceSub([H], Subterm, Subterm1, Term1) :-
atomic(X),
H == Subterm,
H = Subterm1.
replaceSub([H], Subterm, Subterm1, Term1) :-
complexTerm(H),
replace(H, Subterm, Subterm1, Term1).
replaceSub([H|T]) :- % not sure where to continue with this.
任何指针将不胜感激。请注意,对于考试,我们不能使用外部模块。
感谢您的宝贵时间。
【问题讨论】:
-
这里不需要双递归。 replace 可以简单地检查所有术语类型并通过递归来处理复杂的术语。请注意您没有 =.. 案例处理列表案例。
-
@AlanBaljeu 对不起,我的意思是双重递归和递归自身。这是我不确定的步骤。任何指针将不胜感激。
标签: recursion prolog universal