【发布时间】:2015-03-26 07:20:12
【问题描述】:
我正在尝试创建 Prolog 规则以在 Prolog 中以列表形式枚举“二叉树”。我是 Prolog 的新手。
一棵有 0 个节点的树是一个空列表:
[]
一棵有 1 个节点的树是:
[[],[]]
一棵有 2 个节点的树有 2 种可能性:
[[],[[],[]]]
[[[],[]],[]]
等等。
这是我的规则:
bintree(0,[]).
bintree(1,[[],[]]).
bintree(N,[Lc,Rc]) :-
N > 1,
bintree(N1,Lc),
bintree(N2,Rc),
N1 >= 0,
N2 >= 0,
N3 is N1+N2+1,
N==N3.
0 和 1 的查询显然有效。对于 N = 2,它会打印一种可能性,但在我输入分号以获得另一种可能性后会出错。 N>2 的查询直接报错。错误总是一样的:
ERROR: >/2: Arguments are not sufficiently instantiated
我在一些网站上读到过这个错误,但在这里我无法弄清楚是什么导致了这个错误。
提前感谢您的帮助。
【问题讨论】:
-
不,这会使其进入无限循环。
-
要在 Prolog 中使用表达式比较器,所有表达式都必须完全实例化(值已知)。您收到错误是因为当您尝试
N > 1时N没有任何价值。您要满足什么样的查询?你的问题一点都不清楚。 -
它需要一对。第一个是一个正整数,它是树中的节点数。第二个是具有这么多节点的给定格式的树。前任。宾树(2,A)。应该给 A=[[],[[],[]]] ; A=[[[],[]],[]] 表示两棵有 2 个节点的二叉树。对于作为第一个参数给出的所有正整数,它应该终止。
-
在您的子句中,表达式
bintree(N1, Lc)和bintree(N2, Rc)使用N1和N2未实例化的变量调用。因此子序列N > 1将在该错误消息上失败。 -
我正在尝试满足诸如 bintree(5,X) 之类的查询类型。这将使 prolog 打印具有 5 个节点的二叉树的表示。每个空列表 [] 就像 C 中的 NULL 指针。具有 2 个元素 [L,R] 的列表是具有两个元素 L 和 R 作为子节点的节点。当用分号提示时,prolog 应该打印出具有这么多节点的 X 的所有可能的树,然后打印 false。
标签: prolog logic-programming catalan instantiation-error