使用univ谓词递归展开函数

时间:2013-12-12 16:28:40

标签: recursion prolog substitution term

我想在这个术语f(a,b,g(a,h(a))中替换例如a为2。

为此我首先要用univ谓词(= ..)展开这个术语。

到目前为止,我有:

unfold(T1, T2) :-
    T1 =.. T1list,
    T2 = T1list.

当T2是T1的列表重新定位时,这是真的。 但是在这个例子中我需要一种递归方式来做这个,因为一些参数也是函数! 替换后我需要一直回到f(2,b,g(2,h(2)))作为例子

替换我

replace(X,Y,[],[]).
replace(X,Y,[X|T1],[Y|T2]):-
     replace(X,Y,T1,T2).
replace(X,Y,[H|T1],[H|T2]):-
     not(X=H),
     replace(X,Y,T1,T2).

编辑:我目前的解决方案:我的问题是,它不起作用     '替换(a,1,X,f(1,b,g(1,h(1))))。'

replace(_, _, [], []). 
replace(X, Y, L1, L2) :-
    not(is_list(L1)),
    not(is_list(L2)),
    unfold(L1, L1unfold),
    replace(X,Y, L1unfold, L2sub),
    refold(L2sub, L2),
    !.
replace(X, Y, [X|T1], [Y|T2]) :-
    replace(X, Y, T1, T2),
    !.
replace(X, Y, [H|T1], [H|T2]) :-
    \+ is_list(H),
    replace(X, Y, T1, T2),
    !.
replace(X, Y, [H1|T1], [H2|T2]) :-
    replace(X, Y, H1, H2),
    replace(X, Y, T1, T2).

unfold(T1, [H|T2]) :-
  T1 =.. [H|T1Expanded],
  maplist(unfold, T1Expanded, T2).

refold([H|T2],T1):-
  maplist(refold,T2,R),
  T1 =.. [H|R].

1 个答案:

答案 0 :(得分:1)

你非常接近。

unfold(T1, [H|T2]) :-
  T1 =.. [H|T1Expanded],
  maplist(unfold, T1Expanded, T2).