List SWI序言:差异列表-fifo 我在学习PROlog,差异列表对我来说是超级新的,看起来像是从地狱里来的,尤其是我是一个可怜的头脑简单的C++人。 我的任务有问题:

List SWI序言:差异列表-fifo 我在学习PROlog,差异列表对我来说是超级新的,看起来像是从地狱里来的,尤其是我是一个可怜的头脑简单的C++人。 我的任务有问题:,list,prolog,queue,fifo,List,Prolog,Queue,Fifo,addall(-E,+G,+S,-R)将 满足以下条件的变量E的替换 目标G(变量E出现在其中)是 集合S并返回新集合R (该谓词类似于标准谓词findall=3和findall=4) 我已经用LIFO集合实现了这一点,没有问题,但是FIFO有问题,请考虑以下用法: lifo_empty(L), lifo_addall(X,number(odd,X), L, W). 可以,集合W为[8,6,4,2,0],但: fifo_empty(Q), fifo_addall(X, podstaw(c,X)

addall(-E,+G,+S,-R)将 满足以下条件的变量E的替换 目标G(变量E出现在其中)是 集合S并返回新集合R (该谓词类似于标准谓词findall=3和findall=4)

我已经用LIFO集合实现了这一点,没有问题,但是FIFO有问题,请考虑以下用法:

lifo_empty(L), lifo_addall(X,number(odd,X), L, W).
可以,集合W为[8,6,4,2,0],但:

fifo_empty(Q), fifo_addall(X, podstaw(c,X), Q, W).
给我
W=[9,7,5,3 |[1 | | u G3761]-_G3761]
。我想要的是
[9,7,5,3,1 |_G3761]-\u G3761
。我不知道怎么回事,尤其是:

?- fifo_empty(Q), fifo_put(a,Q,W), fifo_put(b,W,C).
C = [a, b|_G3922]-_G3922.
很好用。我的代码:

fifo_empty(X-X).
todiff(X, [X|Xs]-Xs).
fifo_put(E, X-[E|Xs], X-Xs).
fifo_get([E|X]-Xs, X-Xs, E).

fifo_append([],S,S).
fifo_append([H|T],S,W) :- fifo_put(H,S,NS), lifo_append(T,NS,W).

fifo_addall(E, Goal, S, R) :- findall(E,Goal, W), fifo_append(W,S,R).

提前感谢。

这可能是因为您将呼叫后进先出附加/3作为最后一个目标:

fifo_append([H|T],S,W) :- fifo_put(H,S,NS), lifo_append(T,NS,W).
…而不是
fifo\u append/3
?尝试将最后一个子目标调用更改为
fifo\u append/3
。根据以下事实,使用此更改测试代码:

person(joe).
person(mary).
给出:

?- fifo_empty(Q), fifo_addall(X, person(X), Q, W).
Q = [joe, mary|_G677]-[joe, mary|_G677],
W = [joe, mary|_G677]-_G677.

…其中
W
绑定到您所描述的模式。

感谢您的回复。我的问题是,我必须这样做,因为这是我的家庭作业:使用差异列表实现FIFO,并根据FIFO(FIFO_add)提供的接口生成谓词addall(E,Goal,S,R)。嗯——如果一开始就明确这一点,可能会更好。另外,当问一个家庭作业问题时,应该加上这样的标签。如果我能弄明白的话,我将尝试帮助您使用代码并对我的帖子进行编辑:-)