Prolog 叶([X,[],[],[X])。如何获取树的叶子列表?
我为获取树的叶子编写了这段代码Prolog 叶([X,[],[],[X])。如何获取树的叶子列表?,prolog,Prolog,我为获取树的叶子编写了这段代码 leaf([X,[],[],[X])。 叶([[uUg,G,D],N):- 叶(G,N1), 叶(D,N2), 混合物(N1、N2、N3), N是N3。 但执行此查询时: ?-leaf([19、[18、[]、[]]、[17、[]、[]]、N)。 我得到这个错误: ERROR:Type ERROR:expected为“[]”,found为“[18,17]”(一个列表)(“x”必须包含一个字符) 错误:在: 错误:[9]_2656是[18,17] 错误:[8]le
leaf([X,[],[],[X])。
叶([[uUg,G,D],N):-
叶(G,N1),
叶(D,N2),
混合物(N1、N2、N3),
N是N3。
但执行此查询时:
?-leaf([19、[18、[]、[]]、[17、[]、[]]、N)。
我得到这个错误:
ERROR:Type ERROR:expected为“[]”,found为“[18,17]”(一个列表)(“x”必须包含一个字符)
错误:在:
错误:[9]_2656是[18,17]
错误:[8]leaf([19,…,|…],_2696)位于e:/downloads/science/riag/university/1st master fond/1st term/pp/tp/tp_prolog/tp1.pl:67
错误:[7]
问题是
N is N3.
您正在使用is
作为赋值运算符
但它做到了以下几点:
N
:
leaf([X,[],[],[X])。
叶([[uUg,G,D],N):-
叶(G,N1),
叶(D,N2),
混合物(N1、N2、N)。%更新由N指定的内容
问题在于Prolog只分配一次:
- 由N指定的任何东西都是一个容器(一个存储单元)
- 最初,该容器是空的(也称为“变量未实例化”或“变量为var”,或
successed)var(N)
- 随着程序的进行,容器被设置为一个术语(aka。“变量被实例化”或
成功)。术语可以是完整的,即(可能已填充的)容器的图形nonvar(N)
- 您不能取消设置容器的内容,除非通过以前完成的计算取消历史记录,即“通过回溯”
`Type error:`[]'应为,找到了`18,17]'(列表)
由SWI Prolog生成的代码确实令人困惑。这可能是因为一个人可以写这样的东西:
N是[a]。
而N
与a
的(在SWI-Prolog,sanely-Unicode中)代码点统一
?-N是[a]。
N=97。
?-N是[97]。
N=97。
我认为这是在古代序言中获取(由于EBCDIC在95年非常热门,不明智地未指定和未标准化)码点的非模式。这可能应该永远烧掉
还有更理智的
?-N是0'a。
N=97。