【问题标题】:Counting the elements of a dynamic list and "evaluating" the solution (Prolog)计算动态列表的元素并“评估”解决方案(Prolog)
【发布时间】:2013-12-15 22:32:21
【问题描述】:

我创建的谓词无法正常工作。 谓词应该计算数据库中所有事实的项目并“评估”它们。 (我稍后会解释我所说的“评估”是什么意思)

例如事实是:

:- dynamic listitem /1.
listitem(number).
listitem(letter).
listitem(word).
listitem(sentence).

我创建的第一个谓词将所有事实收集到一个列表中:

members(W) :- bagof(X,listitem(X),W).

现在我想计算列表中的项目。所以我为计数创建了一个通用谓词:

count([],0).
count([_|L],N) :- count(L,N1), N is N1+1.

我的下一个谓词无法正常工作。这个谓词要计算上面所有的事实项。

count_members(U) :- one_list([bagof(X,listitem(X),_W)],U).

问题是,数据库应该是动态的,以便我可以添加和删除其他项目。这意味着,我不能问

?- count([number,letter,word,sentence],N) 

因为事实可能已经改变。

最后一步根本不起作用,因为我的最后一个谓词是错误的,应该如下: 编写“all_members(X)”序言应该返回一个评估。例如。如果数据库中的项目数为 4,prolog 应为查询“all_members(X)”返回“X = 四个项目”。 我希望你明白我的问题。同样,我正在搜索的谓词是“all_members(X)”。我创建的其他谓词应该可以帮助我创建实际的谓词。

如果您能帮助我找到解决问题的方法,我将非常高兴! (不然今晚睡不着……) 谢谢!!

编辑:

抱歉,我忘记为 one_list 写定义了。我的想法是制作例如如下所示的列表:

 [[number], [letter], [word]] 

到一个看起来像这样的列表:

[number, letter, word, list]

one_list(X,[X]) :- \+ is_list(X).
one_list([],[]).
one_list([X|Xs],Zs) :- one_list(X,Y), one_list(Xs,Ys), append(Y,Ys,Zs).

【问题讨论】:

  • 您实际上非常接近您的解决方案。就两行。 one_list 是如何定义的?即,到目前为止,您尝试了什么?
  • @ChristianF 我编辑了我的问题。有点忘了写下定义^^
  • 为什么这么复杂?你已经有了你的名单(成员(X)),现在你需要做的就是数一数,不是吗?
  • count_members(U) :- members(W), count(W,U). Prolog 的谓词就是这样组成的。
  • 你不需要count/2。您可以只使用 length/2 内置谓词来表示列表的长度。

标签: list prolog counting dynamic-list


【解决方案1】:

您的问题似乎有些混乱。

计算facts/1 的数量,如果您的数据库(即使数据库中当前没有facts,只要将facts 声明为dynamic,它也会按预期工作):

?- findall(X, facts(X), Xs), length(Xs, L).

请注意,您不能说 length(findall(...), L),因为 Prolog 有谓词,而不是函数(正如 Will Ness 在 cmets 中对您的问题所指出的那样)!

创建列表列表是奇怪且不必要的。我不太明白你为什么需要它(如果我遗漏了重要的东西,请详细说明)。

使用flatten/2 不是犯罪,但通常表明设计决策不佳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多