Prolog/介紹/答案
外觀
我們將使用以下資料庫來表示此家族樹的一部分。
man(sirius_black). man(regulus_black). man(orion_black). man(cygnus_black). man(pollux_black). woman(bellatrix_black). woman(andromeda_black). woman(narcissa_black). woman(walburga_black). woman(druella_roisier). woman(irma_crabbe). parent(orion_black, sirius_black). parent(walburga_black, sirius_black). parent(orion_black, regulus_black). parent(walburga_black, regulus_black). parent(cygnus_black, bellatrix_black). parent(druella_roisier, bellatrix_black). parent(cygnus_black, andromeda_black). parent(druella_roisier, andromeda_black). parent(cygnus_black, narcissa_black). parent(druella_roisier, narcissa_black). parent(pollux_black, walburga_black). parent(irma_crabbe, walburga_black). parent(pollux_black, cygnus_black). parent(irma_crabbe, cygnus_black).
1. 列出資料庫中的女性
?- woman(Woman). Woman = bellatrix_black ; Woman = andromeda_black ; Woman = narcissa_black ; Woman = walburga_black ; Woman = druella_rosier ; Woman = irma_crabbe.
2. 列出資料庫中的孩子
?- parent(_, Child). Child = sirius_black ; Child = sirius_black ; Child = regulus_black ; ...
3. 列出所有父親和兒子的組合。
?- parent(Father, Son), man(Father), man(Son). Father = orion_black, Son = sirius_black ; Father = orion_black, Son = regulus_black ; Father = pollux_black, Son = cygnus_black ; fail.
4. 哪些女性在資料庫中既有父親又有兒子?
?- woman(Woman), parent(Father, Woman), parent(Woman, Son), man(Father), man(Son). Woman = walburga_black, Father = pollux_black, Son = sirius_black; Woman = walburga_black, Father = pollux_black, Son = regulus_black ; fail.
5. (額外問題) 你能想出一個方法來顯示資料庫中沒有列出父親的女性嗎?你能描述一下你需要編寫這樣的查詢需要做什麼嗎?
你需要使用否定。
要放入 db 中的規則
hasFather(Somebody):- parent(Father,Somebody), man(Father). womenWithNoFather(Woman) :- woman(Woman), \+ hasFather(Woman).
查詢
?- womenWithNoFather(Woman). Woman = druella_roisier ; Woman = irma_crabbe ; fail.