序言.两个变量同名

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)

嗨,

在第二行中有两个相同的变量名称是什么意思?

mat*_*mat 5

我想"第二行"你的意思是"第三行",所以我们谈的是这个条款:

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.当然,没有必要那么冗长,所以我们可以简单地将这些统一直接引入条款头!

这可能听起来很简单,但事实上你的问题是非常好的:我看到很多初学者没有把这种统一纳入条款头,不必要地复杂化他们的代码,同时(这通常是齐头并进)使效率降低.


关于风格的小注释:我建议让表示列表的变量名称以"s"结尾,类似于常规英语复数形式.此外,将下划线(_)附加到辅助谓词的名称通常很有用.所以,我会写出类似于以下内容的初始事实:

reverse_([], Ls, Ls).
Run Code Online (Sandbox Code Playgroud)

当然,这在语义上等同于:

reverse_([], As, Bs) :- As = Bs.
Run Code Online (Sandbox Code Playgroud)

  • 例如在*The Prolog*中很好地解释了与分辨率的连接,我建议你查看它以获取更多信息. (2认同)