Prolog 插入(I,[],[I,[],[])。如何在二叉树中插入值?

Prolog 插入(I,[],[I,[],[])。如何在二叉树中插入值?,prolog,clpfd,Prolog,Clpfd,要向堆中添加新元素,我们必须: 创建包含此元素值的节点 在尽可能靠左的第一个空位置的最后一层系上这个结(如有必要,创建一个新层)。我们总是得到一个完整的二叉树,但不一定是堆 我写了这段代码: 插入(I,[],[I,[],[])。 插入(I,[[ug,D],N):- 深度(G,P1),深度(D,P2),P1P2,插入(I,D,N)。 深度([],0)。 深度(Y,Z,H):- 深度(Y,H1),深度(Z,H2),最大值(H1,H2,H3),H为1+H3。 但当执行此查询时,它将失败: ?-插入(

要向堆中添加新元素,我们必须:

  • 创建包含此元素值的节点
  • 在尽可能靠左的第一个空位置的最后一层系上这个结(如有必要,创建一个新层)。我们总是得到一个完整的二叉树,但不一定是堆
  • 我写了这段代码:

    插入(I,[],[I,[],[])。
    插入(I,[[ug,D],N):-
    深度(G,P1),深度(D,P2),P1P2,插入(I,D,N)。
    深度([],0)。
    深度(Y,Z,H):-
    深度(Y,H1),深度(Z,H2),最大值(H1,H2,H3),H为1+H3。
    
    但当执行此查询时,它将失败:

    ?-插入(2、[19、[18、[12、[]、[]、[15、[]、[]]、[17、[10、[]、[]、[]、[16、[]、[]、N)。
    错。
    
    为什么?

    ((您没有在程序中定义
    max/3
    ,我猜是这样的))

    max(A,B,M):-
    M是最大值(A,B)。
    
    为什么?

    首先,总是从小的例子开始。就像一棵只有一个元素的树。这也是失败的:

    ?-插入(2、[12、[]、[]、N)。
    错。
    
    那为什么呢?如果一个(纯单调的)程序失败了,那么我们需要对它进行推广。让我们这样试一下:

    :- op(950, fy, *). *(_). insert(I, [], [I, [], [] ] ). insert(I, [_, G, D], N):- depth(G, P1), depth(D, P2), P1<P2, * insert(I, G, N). insert(I, [_, G, D], N):- depth(G, P1), depth(D, P2), P1>P2, * insert(I, D, N). 这是对的吗?无论我们从哪一棵树开始,我们总会得到一个单一的解决方案。因此,无论您想在何处插入新元素,都必须解决这个问题

    如果我在AT,考虑使用<代码>库(CLPZ)或其略显过时的前任“代码>库(CPLFD)代替<代码>(>)/2代码/代码>等,因为这不会给您带来太多的错误。


    有关Prolog特有的更多调试方法,请参阅。

    如果您对某个答案感到满意,请单击upvote按钮下方您最喜欢的答案左侧的灰色复选标记接受该答案。 insert(I, [], [I, [], [] ] ). insert(I, [_, G, D], N):- depth(G, P1), depth(D, P2), * P1<P2, insert(I, G, N). insert(I, [_, G, D], N):- depth(G, P1), depth(D, P2), * P1>P2, insert(I, D, N). ?- insert(2, [12, [], []], N). N = [2,[],[]] ; N = [2,[],[]]. ?- insert(2, [19, [18, [12, [], []], [15, [], []]], [17, [10, [], []], [16, [], []]]], N). N = [2,[],[]] ; N = [2,[],[]] ; N = [2,[],[]] ; N = [2,[],[]] ; N = [2,[],[]] ; N = [2,[],[]] ; N = [2,[],[]] ; N = [2,[],[]].