Prolog中istree谓词报错修复:判断对象是否为二叉树
修复Prolog istree谓词的参数数量错误问题
问题原因
你遇到的类型错误,本质是因为在domains里严格定义了tree类型只能是nil,或者带3个参数的t结构(t(symbol, tree, tree))。而测试目标里的t(a, t(b, nil, nil))是只有2个参数的t结构,它根本不符合tree的类型定义,所以Turbo Prolog会直接抛出参数数量错误,而不会走到istree谓词的逻辑判断。
你的需求是让这种不符合二叉树结构的输入返回no而不是报错,因此需要调整代码绕过严格的类型检查。
修复方案
去掉domains的严格类型定义,改用通用的term类型接收参数,让istree谓词通过子句匹配来判断是否为合法二叉树:
修复后的代码
predicates istree(term). clauses istree(nil). istree(t(_, Left, Right)) :- istree(Left), istree(Right). goal % 测试正确的二叉树,返回yes % istree(t(a, t(b, nil, nil), nil)). % 测试参数数量错误的结构,返回no istree(t(a, t(b, nil, nil))).
效果说明
- 传入合法二叉树(如
t(a, t(b, nil, nil), nil))时,会匹配istree(t(_, Left, Right))子句,递归检查左右子树后返回yes。 - 传入参数数量不对的
t结构(如t(a, t(b, nil, nil)))时,它既不匹配istree(nil),也不匹配要求3个参数的t结构子句,因此谓词找不到匹配逻辑,返回no,不会再触发类型错误。
内容的提问来源于stack exchange,提问作者vladoo
相关产品推荐
相关产品推荐

