1

当我喜欢自己解决以下问题时遇到一些困难时,我正在解决一些序言练习:考虑你有这个关于对象的事实基础:

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 和 findall 但找不到正确的答案。

提前谢谢

4

3 回答 3

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].
于 2010-01-12T23:15:21.413 回答
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, ... - ...]].
于 2010-01-12T23:09:49.897 回答
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
于 2010-02-02T14:49:01.730 回答