【发布时间】:2016-05-18 20:54:24
【问题描述】:
my_reverse(L1,L2) :- my_rev2(L1,L2,[]).
my_rev2([],L2,L2).
my_rev2([X|Xs],L2,Acc) :- my_rev2(Xs,L2,[X|Acc]).
嗨,
第二行有两个同名的变量是什么意思?
【问题讨论】:
标签: prolog
my_reverse(L1,L2) :- my_rev2(L1,L2,[]).
my_rev2([],L2,L2).
my_rev2([X|Xs],L2,Acc) :- my_rev2(Xs,L2,[X|Acc]).
嗨,
第二行有两个同名的变量是什么意思?
【问题讨论】:
标签: prolog
我想“第二行”是指“第三行”,所以我们在谈论从句:
my_rev2([], L2, L2).
my_rev2/3 的第一个子句,对吧?
那么,同一个变量在子句头部出现两次是什么意思呢?附带问题:第一个参数在子句头部是[] 是什么意思?
如果您首先引入新的变量,然后将所有的统一显式,这一切都会变得清晰。我们可以这样写子句:
my_rev2(Ls, L1, L2) :- Ls = [], L1 = L2.
现在很清楚:my_rev(Ls, L1, L2) 持有 如果 Ls = [] 和 L1 = L2。当然,没必要这么啰嗦,直接把这样的统一拉到分句头就可以了!
这听起来可能很微不足道,但实际上你的问题是一个非常好的问题:我见过很多初学者不将这样的统一拉入子句头部,不必要地使他们的代码复杂化,同时时间(这通常并存)也降低了效率。
_) 通常很有用。因此,我会写出类似于以下内容的初始事实:
reverse_([], Ls, Ls).
当然,这在语义上等价于:
reverse_([], As, Bs) :- As = Bs.
【讨论】: