【问题标题】:Prolog. Two variable the same name序言。两个变量同名
【发布时间】: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


    【解决方案1】:

    我想“第二行”是指“第三行”,所以我们在谈论从句:

    my_rev2([], L2, L2).
    

    my_rev2/3 的第一个子句,对吧?

    那么,同一个变量在子句头部出现两次是什么意思呢?附带问题:第一个参数在子句头部是[] 是什么意思?

    如果您首先引入新的变量,然后将所有的统一显式,这一切都会变得清晰。我们可以这样写子句:

    my_rev2(Ls, L1, L2) :- Ls = [], L1 = L2.
    

    现在很清楚:my_rev(Ls, L1, L2) 持有 如果 Ls = [] L1 = L2。当然,没必要这么啰嗦,直接把这样的统一拉到分句头就可以了!

    这听起来可能很微不足道,但实际上你的问题是一个非常好的问题:我见过很多初学者将这样的统一拉入子句头部,不必要地使他们的代码复杂化,同时时间(这通常并存)也降低了效率。


    关于样式的小提示:我建议让表示 lists 的变量的名称以“s”结尾,类似于常规的英语复数形式。此外,在辅助谓词的名称后面附加下划线 (_) 通常很有用。因此,我会写出类似于以下内容的初始事实:
    reverse_([], Ls, Ls).
    

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

    reverse_([], As, Bs) :- As = Bs.
    

    【讨论】:

    • 很好的解释!谢谢:)
    • 你能提示我这里哪里有分辨率吗?
    • 与分辨率的联系在 Prolog 的艺术 中有很好的解释,我建议您查看它以获取更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2014-02-09
    • 2019-11-15
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多