Algorithm Prolog程序,这个程序应该做什么?
我一点也不懂Prolog,但我仍然需要了解这个程序的功能。编译器显示有2个语法错误,但是这个程序的主要逻辑应该仍然可以理解Algorithm Prolog程序,这个程序应该做什么?,algorithm,tree,prolog,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) cla
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)]).
这是您可以运行的程序:
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(树(a,树(b,树(c,void,void)),树(e,void,void)),树(d,void,void)),1,c)。
结果将是
C=[s(a,1),s(b,2),s(C,3),s(e,3),s(d,2)]
谓词totree/3
接受以下内容作为输入:
- 表示为
的树,其中树(RootElement,Left,Right)
和Left
是左子树和右子树Right
- 一个数字是你所在的树的级别
- 并返回一个列表,该列表是树的表示形式李>
:元素s(a,1)
位于树的级别1,正确,因为是根(级别1因为在查询中指定)a
:元素s(b,2)
位于树的第2级,这是正确的,因为b
是b
的左子元素a
:元素s(c,3)
位于树的第3级,这是正确的,因为c
是c
的左子元素,也是一片叶子b
- 等等
这是
append/3
的定义:append(List1,List2,List3)
List3
是List1
和List2
的串联(此谓词在某些库中已可用,如lists
这是您可以运行的程序:
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(树(a,树(b,树(c,void,void)),树(e,void,void)),树(d,void,void)),1,c)。
结果将是
C=[s(a,1),s(b,2),s(C,3),s(e,3),s(d,2)]
谓词totree/3
接受以下内容作为输入:
- 表示为
的树,其中树(RootElement,Left,Right)
和Left
是左子树和右子树Right
- 一个数字是你所在的树的级别
- 并返回一个列表,该列表是树的表示形式
:元素s(a,1)
位于树的级别1,正确,因为是根(级别1因为在查询中指定)a
:元素s(b,2)
位于树的第2级,这是正确的,因为b
是b
的左子元素a
:元素s(c,3)
位于树的第3级,这是正确的,因为c
是c
的左子元素,也是一片叶子b
- 等等
这是
append/3
的定义:append(List1,List2,List3)
List3
是List1
和List2
的串联(此谓词已在某些库中可用,因为列出了。这有点不清楚。您还没有说明错误是什么。但看起来您试图在SWI中运行Turbo/PDC/Visual Prolog程序,但该程序不起作用。Turbo、PDC和Visual Prolog是非标准的Prolog实现。将其划分为域
、谓词
、子句
和目标
是这些实现所特有的。基本上,您必须摆脱域
和谓词
部分。子句
是您试图定义的谓词。目标
应该作为谓词编写,或者称为di直截了当地说。在实现上也存在其他差异。这有点不清楚。您还没有说明错误是什么。但看起来您试图在SWI中运行一个Turbo/PDC/Visual Prolog程序,但该程序不起作用。Turbo、PDC和Visual Prolog都是非标准的Prolog实现。将其划分为域
,predicate
、子句
和目标
是这些实现所独有的。基本上,您必须摆脱域
和谓词
部分。子句
是您试图定义的谓词。目标
应该作为谓词编写或直接调用。有实现上的其他差异。