【问题标题】:Prolog Printing a TreeProlog 打印一棵树
【发布时间】:2020-03-27 09:20:29
【问题描述】:
printtree_3( bt(Label,[],[]) ).
printtree_3( bt(Label,Left,Right) ) :- 
    printtree_3( Left ), 
    printtree_3( Right ), 
    printlabel( Label ).

printlabel( X ) :- write( X ), write( ' ' ).

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

例如。

?- printtree_3(a(b,c,d)).

返回 false 而不是打印树。我认为我的谓词调用是错误的,但我不确定。同样,我不相信提供的代码,我只是想运行它以便进行实验。如果有人能解释为什么它不起作用,我将非常感激。

【问题讨论】:

  • 大家好,我现在尝试使用 printtree_3(bt(a,b,c)) 调用谓词。但没有成功。我可能错过了重点。谁能给我一个有效的电话是什么样子的。

标签: tree prolog binary-tree


【解决方案1】:

这失败(返回“false”),因为查询是错误的:

你在问

printtree_3(a(b,c,d))

用函子a给出一棵树

但是代码只定义了谓词printtree_3 的子句,它们接受函子bt 的参数(可能是“二叉树”而不是“搁浅的东西”):

printtree_3( bt(Label,[],[])      )
printtree_3( bt(Label,Left,Right) )

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

【讨论】:

  • @GuyCoder 很困难,因为命令式代码 tychk 的目标是确保只使用来自某个域的参数调用函数。在 Prolog 中,这些 args 可能是未实例化的 var,并且使用来自错误域的 args 调用实际上可能是完全可以接受的(当然,产生false)。 Typeless Clojure 有specs,听起来不错。 (顺便说一句,Lambda-Prolog 有一些 ML 风格的类型表达式,但 adding types to LP 似乎还没有取得多大成功。也许在 Mercury 中?)
  • adding types to LP seems to have been not met which much success 我以前认为应该将类型添加到 Prolog,但现在不认为应该添加。然而,有些允许 any 类型允许所有通过,但仍然是一种类型。就我个人而言,我获得了足够的经验来了解何时以及何时不添加类型检查,以及在达到其目的后何时删除它们。
  • 大家好,我试着问 printtree_3(bt(a,b,c))。我仍然没有得到任何东西,谁能解释为什么?
  • @JunDeveloper 因为下一个调用将是printtree_3(b),它也不匹配任何内容。你走得太快了,你需要阅读 Prolog 介绍文本。 “慢慢来”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2022-11-11
  • 2021-12-11
  • 2013-10-25
  • 2014-07-15
相关资源
最近更新 更多