【发布时间】: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