0

我正在学习 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).

提前致谢。

4

1 回答 1

2

是否会发生这种情况,因为您将呼叫lifo_append/3作为该行中的最后一个目标:

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

...而不是fifo_append/3?尝试将最后一个子目标调用更改为fifo_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.

... whereW绑定到您所描述的模式。

于 2011-04-15T04:19:50.177 回答