【问题标题】:How to get a list of objects in Prolog如何在 Prolog 中获取对象列表
【发布时间】:2016-07-01 22:05:32
【问题描述】:

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

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

提前谢谢

【问题讨论】:

    标签: list prolog prolog-findall


    【解决方案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].
    

    【讨论】:

      【解决方案2】:

      我更改了输入格式。现在搜索起来容易一些。 我希望它可以这样。

      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, ... - ...]].
      

      【讨论】:

        【解决方案3】:
        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
        

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          • 2020-02-15
          • 2018-07-09
          • 2019-08-24
          • 2019-02-06
          • 1970-01-01
          相关资源
          最近更新 更多