我在使用时遇到问题setof/3
,缺少一些结果。
上下文:
我使用 SWI-Prolog load_xml() 加载一个 xml 文件以获取递归列表元素(参见示例中的 testelement)。然后我想在这个列表中查找特定的元素(在 xml 树中)。结合使用
,效果很好。但如果我使用,我会错过一个结果。我想这是由于递归调用获取/保留元素而导致的问题?知道将元素从递归列表中取出的另一种解决方案吗?findall/3
sort/2
setof/3
setof/3
askElement/3
我的测试代码:
testElement([element('recipeml',[version=0.5],
[element('recipe',[],
[element('head',[],
[element('title',[],['Spaghetti Bolognese']
)]
),
element('ing-div',[type=titled],
[element('title',[],['sauce']),
element('ingredients',[],
[element('ing',[],
[element('item',[],['hackfleisch']),
element('item',[],['fleischtomaten']),
element('item',[],['zwiebeln']),
element('item',[],['sellerie']
)]
)]
)]
)]
),
element('recipe',[],
[element('head',[],
[element('title',[],['Erbsensuppe']
)]
),
element('ing-div',[type=titled],
[element('title',[],['elementar']),
element('ingredients',[],
[element('ing',[],
[element('item',[],['sahne']),
element('item',[],['erbsen']),
element('item',[],['gemüsebrühe']
)]
)]
)]
)]
)]
)]).
askElement(Name, Child, Parent) :-
(
member( element(Name,_,Child),Parent)
;
member( element(_,_,NewParent),Parent),
[_|_] = NewParent,
askElement(Name, Child, NewParent)
).
allRecipes_findall(RecipeName) :-
testElement(Knot),
findall(TmpR,(askElement('head',HKnot,Knot),askElement('title',TmpR,HKnot)),Bag),
sort(Bag, RecipeName).
allRecipes_setof(RecipeName) :-
testElement(Knot),
setof(TmpR,(askElement('head',HKnot,Knot),askElement('title',TmpR,HKnot)),RecipeName).
我的输出:
3 ?- allRecipes_findall(X).
X = [['Erbsensuppe'], ['Spaghetti Bolognese']].
4 ?- allRecipes_setof(X).
X = [['Erbsensuppe']]
我希望在这两种情况下我都能得到
X = [['Erbsensuppe'], ['Spaghetti Bolognese']].
怎么了?
提前谢谢了!
PS:非常欢迎对我(第一次尝试)Prolog 代码的每条评论/评论:}