0

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

例如,事实是:

:- 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).
4

1 回答 1

1

您的问题似乎有些混乱。

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

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

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

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

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

于 2013-12-16T06:28:39.337 回答