prolog - 从列表中提取术语

时间:2013-01-20 21:24:25

标签: list prolog

我有一些汽车的基本部分,例如:

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)'?或者至少只显示元素,而不是带有仿函数的复合词。

1 个答案:

答案 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.