Prolog程序,这个程序应该做什么?

时间:2017-11-24 10:34:27

标签: algorithm tree prolog

我根本不认识Prolog,但我仍然需要了解这个程序的功能。编译器显示有2个语法错误,但该程序的主要逻辑应该仍然可以理解。

domains
 value=symbol
 level=integer
 ltype1=s(value,level)
 ltype2=tree(value,ltype2,ltype2); void
 list1=ltype1*

predicates
 append(list1,list1,list1)
 totree(ltype2,integer,list1)

clauses
 append([],X,X).
 append([X|T],Y,[X|Z]):-append(T,Y,Z).

 totree(void,_,[]).
 totree(tree(X,Y,Z),N,[s(X,N)|TA]):-
    K=N+1,
    totree(Y,K,TA1),
    totree(Z,K,TA2),
    append(TA1,TA2,TA).

goal
 totree(
    tree(a,tree(b,tree(c,void,void),tree(e,void,void)),tree(d,void,void)),
    1,C),
 write(C),
 totree(W,1,
          [s(a,1),s(b,2),s(c,3),s(e,3),s(d,2)]).

1 个答案:

答案 0 :(得分:0)

这是您可以运行的程序:

append([],X,X).
append([X|T],Y,[X|Z]):-
    append(T,Y,Z).

totree(void,_,[]).
totree(tree(X,Y,Z),N,[s(X,N)|TA]):- 
    K is N+1,
    totree(Y,K,TA1),
    totree(Z,K,TA2),
    append(TA1,TA2,TA).

如果您运行查询

?-totree(tree(a,tree(b,tree(c,void,void),tree(e,void,void)),tree(d,void,void)),1,C).

结果将是

C = [s(a, 1), s(b, 2), s(c, 3), s(e, 3), s(d, 2)]

谓词totree/3接受输入:

  • tree(RootElement,Left,Right)表示的树,其中LeftRight是左右子树,
  • 一个数字,就是你所在树的等级
  • 并返回一个列表,它是树的表示。

让我们分析一下结果。

  • s(a,1):元素a位于树的第1级,正确是因为是根(因为在查询中指定了级别1)。
  • s(b,2):元素b位于树的第2级,正确是因为ba的左子。
  • s(c,3):元素c位于树的第3级,这是正确的,因为cb的左子,也是一个叶子。
  • 等......

这是append/3的定义:append(List1,List2,List3) List3List1List2的串联(此谓词在某些库中已经可用{ {1}}。