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
作为赋值运算符

但它做到了以下几点:

  • 计算右侧的算术表达式
  • 将结果与左侧统一
  • 你根本不需要指派任务

    Prolog提供的逻辑变量的行为与有状态编程语言中对全局变量的引用相同

    因此,您只需更改名称
    N

    leaf([X,[],[],[X])。
    叶([[uUg,G,D],N):-
    叶(G,N1),
    叶(D,N2),
    混合物(N1、N2、N)。%更新由N指定的内容
    
    问题在于Prolog只分配一次:

    • 由N指定的任何东西都是一个容器(一个存储单元)
    • 最初,该容器是空的(也称为“变量未实例化”或“变量为var”,或
      var(N)
      successed)
    • 随着程序的进行,容器被设置为一个术语(aka。“变量被实例化”或
      nonvar(N)
      成功)。术语可以是完整的,即(可能已填充的)容器的图形
    • 您不能取消设置容器的内容,除非通过以前完成的计算取消历史记录,即“通过回溯”
    p.S.

    `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。