Tree 序言打印树

Tree 序言打印树,tree,prolog,binary-tree,Tree,Prolog,Binary Tree,我第一次尝试在prolog中遍历一棵树,我想我会用其他人的代码打印一棵树,亲自查看它的工作情况。问题是,试图运行这段代码时,swipl编译器总是得到“False” 比如说 printtree_3( bt(Label,[],[]) ). printtree_3( bt(Label,Left,Right) ) :- printtree_3( Left ), printtree_3( Right ), printlabel( Label ). printlabel( X

我第一次尝试在prolog中遍历一棵树,我想我会用其他人的代码打印一棵树,亲自查看它的工作情况。问题是,试图运行这段代码时,swipl编译器总是得到“False”

比如说

printtree_3( bt(Label,[],[]) ).
printtree_3( bt(Label,Left,Right) ) :- 
    printtree_3( Left ), 
    printtree_3( Right ), 
    printlabel( Label ).

printlabel( X ) :- write( X ), write( ' ' ).
返回false,而不是打印树。我认为我的谓词调用是错误的,但我不确定。同样,我对所提供的代码不感兴趣,我只想运行它,以便进行实验。如果有人能解释为什么它不起作用,我将非常感激。

这会失败(返回“false”),因为查询为false:

你在问

?- printtree_3(a(b,c,d)).
用函子
a

但是,代码仅为谓词
printtree_3
定义子句,这些子句接受带有functor
bt
的参数(可能是“二叉树”而不是“搁浅物”):


没有与您的查询匹配的内容。Prolog说“false”(这意味着没有证据表明
printtree_3(a(b,c,d))
是真的)

@GuyCoder很难,因为命令式代码tychk的目标是确保只使用某个域中的参数调用函数。在Prolog中,这些arg可能是未实例化的var,使用来自错误域的arg调用实际上可能是完全可接受的(当然,这会导致
false
)。Clojure没有打字,听起来不错。(顺便说一句,Lambda Prolog有一些ML风格的类型表达式,但似乎没有达到多大的成功。可能在Mercury?
向LP添加类型似乎没有达到多大的成功
我过去认为应该向Prolog添加类型,但现在不认为应该。然而,有些人允许
任何
类型,该类型允许全部通过,但仍然是一种类型。就我个人而言,我获得了足够的经验,知道什么时候不添加类型检查,同样重要的是,在它们达到目的后什么时候删除它们。而我仍然没有得到任何东西,有人能解释为什么吗?@JunDeveloper,因为下一个调用将是
printtree\u 3(b)
,它也不匹配任何东西。你走得太快了,你需要读一篇序言介绍文本。“慢慢加速”。嘿,伙计们,我现在试着用printtree_3(bt(a,b,c))调用谓词。但是没有成功。我可能没有抓住要点。有人能告诉我一个有效的电话是什么样子的吗。
printtree_3(a(b,c,d))
printtree_3( bt(Label,[],[])      )
printtree_3( bt(Label,Left,Right) )