【发布时间】:2018-01-29 09:59:57
【问题描述】:
下面程序的意图如下 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(X,Y) 时找到一个包含单个原子的列表吗?为什么你的尾巴叫H?为什么将输出列表用作列表的头部而不是列表的尾部?您使用了哪些查询来获得底部输出?
-
了解差异列表的有用资源:Understanding difference lists
-
所有基本术语的列表,例如
R = [a,a,a]。您实际上是指基本参数的列表。f(a,a)是一个基本术语,f(a,f(a,a))是一个基本术语,等等。a在这些情况下是一个参数。另外,您的问题真的仅限于原子a、b和c,还是您需要能够处理,例如e?如果是这种情况,您可以概括 Tomas 给出的解决方案:clist_d(X,[X|R],R) := atom(X). -
@lurker 你说的完全正确,我的意思是地面物品清单。是的,这是正确的,我的程序仅限于原子 a、b、c。我将编辑我的帖子,让未来的读者更清楚。
-
@G_V H 是在这种情况下的孔的助记符,我将编辑我的第二个查询,以便将来的读者更清楚。