2013-01-20 39 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