2013-01-20 71 views
0

嗯,我有車的一些基本的部分,例如:序言 - 從列表中提取方面

elementary_part(spoke). 
elementary_part(rim). 
elementary_part(hub). 

和一些子組件,如:

subcomponent(wheel, [quant(spoke, 5), quant(rim, 1), quant(hub, 1)]). 

,我想寫一個「 consists_of」計劃,讓基本的部分,如

consists_of(wheel, P). 

我迄今爲止撐過了這一點:

consists_of(wheel, P):- parts(wheel, P). 
quant(X,Y):- write(Y), write(' piece(s) of '), write(X), write('.'), nl. 
parts(X,Y):- subcomponent(X, [H|T]), print_a_list([H|T]). 

print_a_list([]). 
print_a_list([H | T]) :- nl, write(H), print_a_list(T). 

我得到的結果是:

?- consists_of(wheel,P). 

quant(spoke,5) 
quant(rim,1) 
quant(hub,1) 
true. 

...這不是我想要的。我得到正確的結果,當我嘗試

consists_of(wheel, P):- quant(spoke, 5), quant(rim, 1), quant(hub, 1). 

但因爲我這樣做了很多汽車零部件我知道這是不是解決辦法。

我錯過了什麼?我怎樣才能單獨提取列表中的元素,以便'quant(X,Y)'能正確顯示?或者至少只顯示元素,而不是與函子的複合項。

回答

2

你只需要通過調用的調用替換到write(H)quant

print_a_list([]). 
print_a_list([quant(X,Y) | T]) :- nl, quant(X,Y), print_a_list(T). 

如果你仍想保持你print_a_list儘可能通用做

print_a_list([]). 
print_a_list([H | T]) :- nl, write_q(H), print_a_list(T). 

write_q(H) :- H. 

有些人可能不喜歡th Ë最後的解決方案,以便替代將是

write_q(quant(X,Y)):- write(Y), write(' piece(s) of '), write(X), write('.'), nl. 
+0

非常感謝,最後兩個解決方案的工作,第一個有一些錯誤,但我很滿意,不能把我的手指上,它似乎相當簡單最後,謝謝! – Gkri