我根本不认识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)]).
答案 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)
表示的树,其中Left
和Right
是左右子树,让我们分析一下结果。
s(a,1)
:元素a
位于树的第1级,正确是因为是根(因为在查询中指定了级别1)。s(b,2)
:元素b
位于树的第2级,正确是因为b
是a
的左子。s(c,3)
:元素c
位于树的第3级,这是正确的,因为c
是b
的左子,也是一个叶子。这是append/3
的定义:append(List1,List2,List3)
List3
是List1
和List2
的串联(此谓词在某些库中已经可用{ {1}}。