【发布时间】:2013-11-24 21:06:57
【问题描述】:
我正在学习 Prolog,差异列表对我来说是超级新的,看起来就像地狱一样,尤其是我绝对是一个可怜的、头脑简单的 C++ 家伙 :) 我的任务有问题:
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|_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).
提前致谢。
【问题讨论】: