【问题标题】:SWI Prolog: difference lists - fifoSWI Prolog:差异列表 - fifo
【发布时间】: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).

提前致谢。

【问题讨论】:

    标签: list prolog queue fifo


    【解决方案1】:

    这可能是因为您将 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.
    

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

    【讨论】:

    • 感谢您的回复。我的问题是我必须这样做,因为这是我的作业:使用差异列表实现 FIFO,并根据 FIFO 提供的接口制作 predicat addall(E, Goal, S, R) ( fifo_add)。
    • 嗯——一开始就说清楚可能会很好。另外,当问一个家庭作业问题时,它应该被标记为这样。如果可以的话,我会帮助您编写代码并编辑我的帖子:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多