【发布时间】:2015-08-17 19:49:44
【问题描述】:
我必须编写 tr 规则来将所有出现的列表元素值转换为另一个值。
tr(A,B,L,M) 如果列表 M 与列表 L 相同,只是 L 中出现的每个 A 都被 B 替换。例如:
?- tr(1,2,[1,4,1,5],L).
L = [2, 4, 2, 5].
到目前为止我所拥有的:
tr(_, _, [], []).
tr(O, R, [O|T], [R|T2]) :- tr(O, R, T, T2).
tr(O, R, [H|T], [H|T2]) :- H \= O, tr(O, R, T, T2).
有没有办法将tr(_, _, [], []). 替换为tr(A,B,L,M). 以便它使用字母A,B,L,M?
【问题讨论】:
-
你为什么要这样?规则
tr(_,_,[],[])匹配空列表的大小写,这样一目了然。如果有 4 个不同的变量,你会得到什么? -
问问自己:“在空列表中哪个元素可以被另一个元素替换?”
-
tr(_, _, [], []).是表达该特定规则的最合适的方式。你可以说,tr(A, B, L, M) :- L = [], M = [].,但它的效率略低,你会在A和B上收到单例变量警告。或者您可以说,tr(_A, _B, L, M) :- L = [], M = [].以摆脱警告,但它仍然不如tr(_, _, [], []).清晰。