Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List prolog-从列表中提取术语_List_Prolog - Fatal编程技术网

List prolog-从列表中提取术语

List prolog-从列表中提取术语,list,prolog,List,Prolog,我有一些汽车的基本部件,例如: elementary_part( spoke ). elementary_part( rim ). elementary_part( hub ). 以及一些子组件,例如: subcomponent( wheel, [quant( spoke, 5 ), quant( rim, 1 ), quant( hub, 1)] ). 我正试图编写一个“包含”程序,给出基本部分,例如 consists_of(wheel, P). 到目前为止,我已经完成了这一点: con

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

elementary_part( spoke ).
elementary_part( rim ).
elementary_part( hub ).
以及一些子组件,例如:

subcomponent( wheel, [quant( spoke, 5 ), quant( rim, 1 ), quant( hub, 1)] ).
我正试图编写一个“包含”程序,给出基本部分,例如

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

您只需要将对
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([H | T]) :- nl, write_q(H), print_a_list(T).

有些人可能不喜欢最后一种解决方案,因此另一种选择是

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

非常感谢,最后两个解决方案都有效,第一个解决方案有一些错误,但我很满意,无法指出问题所在,最后看起来很简单,谢谢!
write_q(quant(X,Y)):- write(Y), write(' piece(s) of '), write(X), write('.'), nl.