当我喜欢解决以下问题时,我正在解决一些序言练习: 考虑一下你有关于object的事实基础:
object(obj1).
object(obj2).
object(obj3).
object(obj4).
object(obj5).
material(obj1,wood).
material(obj2,wood).
material(obj3, glass).
material(obj4, glass).
material(obj5, iron).
type(obj1, able).
type(obj2, chair).
type(obj3, mesa).
type(obj4, jar).
type(obj5, rattle).
weight(obj1, 10.5).
weight(obj2, 1.5).
weight(obj3, 1.6).
weight(obj4, 0.5).
weight(obj5, 1.8).
现在的想法是创建谓词object_description(List),其中List是每个对象与它的特征的连接,如:
([obj1-wood-table-10.5, obj2-wood-chair-1.5, …, obj5-iron-rattle-1.8] )
我尝试使用bagof并找到了但却找不到合适的答案。
提前谢谢
答案 0 :(得分:1)
?- findall(O-M-T-W,(object(O),material(O,M),type(O,T),weight(O,W)),Res).
Res = [obj1-wood-able-10.5, obj2-wood-chair-1.5, obj3-glass-mesa-1.6, obj4-glass-jar-0.5, obj5-iron-rattle-1.8].
答案 1 :(得分:0)
我改变了输入格式。现在搜索更容易一些。 我希望这样没事。
obj(obj1, material, wood).
obj(obj2, material, wood).
obj(obj3, material, glass).
obj(obj4, material, glass).
obj(obj5, material, iron).
obj(obj1, type, table).
obj(obj2, type, chair).
obj(obj3, type, mesa).
obj(obj4, type, jar).
obj(obj5, type, rattle).
obj(obj1, weight, 10.5).
obj(obj2, weight, 1.5).
obj(obj3, weight, 1.6).
obj(obj4, weight, 0.5).
obj(obj5, weight, 1.8).
鉴于此输入格式,您现在可以将其映射到列表(列表),例如像这样:
object_description(List) :-
findall(Id-TmpList, bagof(Type-Value, obj(Id, Type, Value), TmpList), List).
这不会产生问题中的确切输出格式,但会提供类似的东西(并且可能更容易进一步处理)。
用法:
?- object_description(List).
List = [obj1-[material-wood, type-table, weight-10.5],
obj2-[material-wood, type-chair, weight-1.5],
obj3-[material-glass, type-mesa, weight-1.6],
obj4-[material-glass, type-jar, weight-0.5],
obj5-[material-iron, type-rattle, ... - ...]].
答案 2 :(得分:0)
classic style of prolog :
member(_, []):-!,fail.
member(X, [X| _]).
member(X, [_|T]):- member(X,T).
object_description(R):-
get_all_objects([], R).
get_all_objects(T, [H|R]):-
get_object(H),
not(member(H,T)),
get_all_objects([H|T], R).
get_all_objects([], []).
get_object(Obj):-
object(X),
material(X,M),
type(X, T),
weight(X, W),
concat(X, "-", R1),
concat(R1, M, R2),
concat(R2, "-", R3),
concat(R3, T, R4),
concat(R4, "-", R5),
concat(R5, W, Obj).
% // concat(str1, str2, str3) if your compilator have'nt you must make it or use other %//analog, idea is str1+str2=str3