【发布时间】:2012-04-16 08:34:34
【问题描述】:
我正在尝试编写一个 prolog 程序,它将一个列表、一个 old_subterm 和一个 new_subterm 作为输入,并返回一个新列表,其中 old_subterm 的每个实例都已替换为 new_subterm。 比如
| ?- sub_rep([h(A,g(x)),g(x),g(3)],g(x),p,T).
T = [h(A,p),p,g(3)] ? ;
no
所以我可以使用以下代码使其与基本列表一起使用:
replace(E,S,[],[]).
replace(E,S,[E|T1],[S|T2]):-
replace(E,S,T1,T2).
replace(E,S,[H|T1],[H|T2]):-
E\=H,
replace(E,S,T1,T2).
%(here's some example input/output)
?- replace(b,e,[a,b,c],L).
L = [a, e, c] ;
false.
?- replace(f(Y),g(Y),[f(Y),1,2,f(Y)],L).
L = [g(Y), 1, 2, g(Y)] ;
false.
但是当我尝试使用更复杂的列表时,例如
?- replace(g(Y),h,[f(g(Y)),g(Y),g(1)],L).
我得到以下答案:
Y = 1,
L = [f(g(1)), h, h] ;
false.
这不是我想要的,因为我希望它能够返回:
? - L = [f(h),h,g(1)] ;
false.
我是 prolog 的新手,我可能遗漏了一些明显的东西,但我不明白为什么在这种情况下变量 Y 会被实例化?在第二个示例中,这似乎不是问题。我想这与 g(1) 的外观有关,但我不明白为什么? 提前致谢! :)
【问题讨论】: