因爲我在Prolog中得到了關於我的數據結構的批評,所以我在這裏向專家詢問了替代解決方案。Prolog中的知識表示 - 如何存儲數據?
作爲例子,我有祕方能解密的數據集XML
<recipeml fileversion="13.8.2014">
<recipe>
<head>
<title>Green Soup</title>
</head>
<ing-div type="titled">
<title>soup</title>
<ingredients>
<ing>
<amt><qty>500</qty><unit>gramm</unit></amt>
<item>pea</item>
</ing>
<ing>
<amt><qty>200</qty><unit>ml</unit></amt>
<item>cream</item>
</ing>
...
</ingredients>
</ing-div>
<directions>
<step>Do something, cooking ....</step>
<step>Next do again something...</step>
...
</directions>
</recipe>
<recipe>
...
</recipe>
...
</recipeml>
我選擇將其存儲在序言作爲迭代元素樹使用列表:
database([element('recipeml',[version=0.5],
[element('recipe',[],
[element('head',[],
[element('title',[],['Green Soup']
)]
),
element('ing-div',[type=titled],
[element('title',[],['soup']),
element('ingredients',[],
[element(ing,[],
[ element(amt,[],
[ element(qty,[],['500']), element(unit,[],[gramm]),]),
element(item,[],['pea'])
]),
element(ing,[],
[ element(amt,[],
[ element(qty,[],['200']), element(unit,[],[ml]),]),
element(item,[],['pea'])
])
]
)]
)]
),
element('recipe',[],...
)]
)]).
我想什麼做的是根據用戶輸入輕鬆查看食譜。 用戶可能會將配料或配方名稱的一部分作爲輸入。
其實我跑throught元素通過
ask_element(Name, Child, Parent) :-
(
member(element(Name,_,Child),Parent)
;
member(element(_,_,NewParent),Parent),
[_|_] = NewParent,
ask_element(Name, Child, NewParent)
).
我買了一個特殊的成分配方全部由
findall(RTitle,
(
ask_element('recipe',RKnot,Knot),
ask_element('item',TmpIng,RKnot),
contains(TmpIng,Ingredient),
[Ing|_] = TmpIng, % avoid brackets [Egg]
define_xml_knot(['head','title'],_,RKnot,TmpRTitle),
[RTitle|_] = TmpRTitle % avoid brackets [Soup]
,Bag),
我成績那麼食譜標題的列表。如果輸入配料清單,我需要 第二個分析步驟來獲得最匹配配料的配方。也許這是 不是真正的Prolog風格?
一個想法,由保羅·莫拉(感謝)此話以下,是將數據作爲
recipe(IDnumber,'Green Soup',ingredients(item(500,gramm,'pea'),item(200,ml,'cream')),steps('Do something','Next step do again something')).
我不知道這是否會被真正幫助安排。尋找具有某種成分的配方,如果包含我正在尋找的成分(或部分單詞),我必須逐一查看每個配方的每個配方。如果我想添加一個新的描述符,例如「level(easy)
」我必須將所有數據調用更改爲recipe()
中元素的數量更改。隨着element(element...)
建設,我不必改變電話。 但是迴應會更好,只返回ID號,然後我在一個「呼叫」(recipe(123,X,Y,Z)
)中獲得整個配方以進一步處理。其實我 返回作爲響應「列表中的字符串文本」,你看到它在上面的「袋」...
這是我在Prolog的第一個應用程序,所以我不是很熟悉充足的數據存儲。我會感激每一個提示。
在我的建議中,成分和步驟會有一個參數,分別是成分和步驟的列表。即使用你的例子,配方(ID號,'綠色湯',成分([項目(500,格蘭姆,'豌豆'),項目(200毫升,'奶油')]),步驟(['做點什麼'下一步再做一次']))。'。將配料和步驟作爲具有配方依賴性的複合術語將會使處理變得複雜,而沒有任何益處。這也將更貼近您呈現的XML結構(假設您的意圖是)。 – 2014-09-30 11:49:01