我有一些汽车的基本部分,例如:
elementary_part( spoke ).
elementary_part( rim ).
elementary_part( hub ).
和一些子组件,例如:
subcomponent( wheel, [quant( spoke, 5 ), quant( rim, 1 ), quant( hub, 1)] ).
我正在尝试编写一个“composed_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).
但是因为我在许多汽车零件上这样做,所以我知道这不是解决方案。
我失踪了吗?如何单独对列表元素进行exctract,以便正确显示'quant(X,Y)'?或者至少只显示元素,而不是带有仿函数的复合词。答案 0 :(得分: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.
有些人可能不喜欢上一个解决方案,所以替代方案是
write_q(quant(X,Y)):- write(Y), write(' piece(s) of '), write(X), write('.'), nl.