我正在学习 Prolog,差异列表对我来说是超级新的,看起来就像地狱一样,尤其是我绝对是可怜的、头脑简单的 C++ 人:) 我的任务有问题:
addall(-E, +G, +S, -R) 将满足目标 G(变量 E 出现在其中)的变量 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|_G3761]-_G3761]
。我想要的是[9,7,5,3,1|_G3761]-_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).
提前致谢。