3 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]).
Run Code Online (Sandbox Code Playgroud)
嗨,
在第二行中有两个相同的变量名称是什么意思?
我想"第二行"你的意思是"第三行",所以我们谈的是这个条款:
my_rev2([], L2, L2).
Run Code Online (Sandbox Code Playgroud)
这是第一个条款my_rev2/3,对吗?
那么这个变量在子句头中出现两次是什么意思呢?附带问题:第一个参数[]在子句中是什么意思 ?
如果您首先引入新变量然后明确所有统一,这一切都会变得清晰.我们可以写下如下条款:
my_rev2(Ls, L1, L2) :- Ls = [], L1 = L2.
Run Code Online (Sandbox Code Playgroud)
而现在很明显:my_rev(Ls, L1, L2)持有,如果 Ls = [] 和 L1 = L2.当然,没有必要那么冗长,所以我们可以简单地将这些统一直接引入条款头!
这可能听起来很简单,但事实上你的问题是非常好的:我看到很多初学者没有把这种统一纳入条款头,不必要地复杂化他们的代码,同时(这通常是齐头并进)使效率降低.
_)附加到辅助谓词的名称通常很有用.所以,我会写出类似于以下内容的初始事实:
reverse_([], Ls, Ls).
Run Code Online (Sandbox Code Playgroud)
当然,这在语义上等同于:
reverse_([], As, Bs) :- As = Bs.
Run Code Online (Sandbox Code Playgroud)