我创建的谓词无法正常工作。谓词应该计算数据库中所有事实的项目并“评估”它们。(我稍后会解释我所说的“评估”是什么意思)
例如,事实是:
:- 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).