prolog - 如何在递归中使用差异列表?

标签 prolog difference-lists

下面程序的意图如下clist_d(f(a,f(a,a)),R) 结果是所有基本参数的列表,例如 R = [a,a,a]

%Difference list append.
diffapp(X-Y,Y-Z,X-Z). 

%2 base case
clist_d(a,[a]).
clist_d(b,[b]).
clist_d(c,[c]).

%If we get a term f(X,Y) the first term of such list is the element in X,followed by the elements in Y
clist_d(f(X,Y),R) :-
    clist_d(X,R1),
    clist_d(Y,R2),
    diffapp([R1|H]-H,R2-[],R-[]).

%We can also get a g
clist_d(g(X,Y),R) :-
    clist_d(X,R1),
    clist_d(Y,R2),
    diffapp([R1|H]-H,R2-[],R-[]).

但是,该程序包含一个错误。使用以下查询运行程序:

?- clist_d(f(a,a),R).
R = [[a],a] ?

产生一个错误,如您在上面看到的,单独测试差异列表我得到以下结果

?- X = [a,b,c|T], Y = [1,2,3],diffapp(X-T,Y-[],R-[]).
X = [a,b,c,1,2,3],
T = [1,2,3],
Y = [1,2,3],
R = [a,b,c,1,2,3] ? 
yes

我在主程序中犯了一个错误,但我不知道要添加什么才能使我的 diffapp 在那里工作。

最佳答案

使用差异列表,您希望在任何地方传递一对参数,并且确实需要任何附加,因此顶级调用应该是:

clist_d(f(a,f(a,a)),R,[])

输出中嵌套的问题是因为您的基本情况返回一个列表 (R1),然后在调用追加时将其 cons ([R1|H])。如果没有附加,这种情况就不会发生。

clist_d(f(X,Y),R0,R) :-
  clist_d(X,R0,R1),
  clist_d(Y,R1,R).

clist_d(g(X,Y),R0,R) :-
  clist_d(X,R0,R1),
  clist_d(Y,R1,R).

clist_d(a,[a|R],R).
clist_d(b,[b|R],R).
clist_d(c,[c|R],R).

产品:

| ?- clist_d(f(a,f(a,a)),R,[]).
R = [a,a,a] ? ;
no

关于prolog - 如何在递归中使用差异列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48498573/

相关文章:

prolog - 理解差异列表(Prolog)

list - Prolog:列表和差异列表的图形表示

prolog - 序言差异列表

Prolog箭头运算符

printing - Prolog - 使用 format/2 打印列表列表

haskell - 了解差异列表的概念

prolog - Prolog 中的差异列表和可变变量

prolog - 序言中的警告 : Singleton variables: [Alice, Ben]

prolog - 在列表中查找唯一项

Prolog程序检查数字是否为素数