У меня проблемы с использованием setof/3
, отсутствуют некоторые результаты.
Контекст:
Я загружаю xml-файл, используя SWI-Prolog load_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 очень приветствуется :}