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

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

我一点也不懂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)]).

这是您可以运行的程序:

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)
    :元素
    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
的串联(此谓词在某些库中已可用,如
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)
    :元素
    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
的串联(此谓词已在某些库中可用,因为
列出了

。这有点不清楚。您还没有说明错误是什么。但看起来您试图在SWI中运行Turbo/PDC/Visual Prolog程序,但该程序不起作用。Turbo、PDC和Visual Prolog是非标准的Prolog实现。将其划分为
谓词
子句
目标
是这些实现所特有的。基本上,您必须摆脱
谓词
部分。
子句
是您试图定义的谓词。
目标
应该作为谓词编写,或者称为di直截了当地说。在实现上也存在其他差异。这有点不清楚。您还没有说明错误是什么。但看起来您试图在SWI中运行一个Turbo/PDC/Visual Prolog程序,但该程序不起作用。Turbo、PDC和Visual Prolog都是非标准的Prolog实现。将其划分为
predicate
子句
目标
是这些实现所独有的。基本上,您必须摆脱
谓词
部分。
子句
是您试图定义的谓词。
目标
应该作为谓词编写或直接调用。有实现上的其他差异。