の使用に問題がありsetof/3
ます。一部の結果が表示されません。
コンテキスト:
SWI-Prolog load_xml() を使用して xml ファイルをロードし、再帰的なリスト要素を取得します (例の testelement を参照)。次に、このリスト (xml ツリー内) で特定の要素を検索します。と組み合わせて
使用すると、うまく機能します。しかし、 を使用すると、結果が 1 つ失われます。要素を取得/保持するための再帰呼び出しが原因で問題があると思いますか? 再帰リストから要素を取得する別の解決策を知っている人はいますか?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 コードのコメント/レビューは大歓迎です :}