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)”?或者至少只显示了元素,而不是带有函子的复合项。

4

1 回答 1

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.
于 2013-01-21T07:56:04.060 回答