跳轉到內容

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.


華夏公益教科書