代码之家  ›  专栏  ›  技术社区  ›  Dennis Vash

如何在prolog中提取要列出的数据?

  •  4
  • Dennis Vash  · 技术社区  · 6 年前

    我有一个数组 L 对于某种类型,我正在尝试将数据提取到数组中,例如:

    L=[day(sunday),day(monday)]
    

    Target=[sunday,monday]
    

    尝试使用 forall 并在prolog列表中搜索相关问题。

    extract_data_to_list(L,Target) :-
        member(day(Day),L),
        length(L, L1),
        length(Target, L1),
        member(Day,Target).
    

    电流输出:

    ?- extract_data_to_list([day(sunday),day(monday)],Target).
    Target = [sunday, _5448] ;
    Target = [_5442, sunday] ;
    Target = [monday, _5448] ;
    Target = [_5442, monday].
    

    期望输出:

    ?- extract_data_to_list([day(sunday),day(monday)],Target).
    Target=[sunday,monday]
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   lurker    6 年前

    这是一个理想的问题 maplist 以下内容:

    day_name(day(DayName), DayName).
    
    dates_daylist(Dates, DayList) :-
        maplist(day_name, Dates, DayList).
    

    应用映射列表 day_name 到中的每个对应元素对 Dates DayList 是的。

        2
  •  3
  •   false Joan C    6 年前

    这是一个理想的问题 library(lambda) 对于 SICStus | SWI 以下内容:

    maplist(\day(N)^N^true, Dates, Daylist).
    
        3
  •  1
  •   Daniel Lyons    6 年前

    我还有其他两种方法你可以这样做,以防你想知道。

    ?- findall(D, member(day(D), [day(monday), day(tuesday)]), Days).
    Days = [monday, tuesday].
    

    这里的诀窍是你可以使用 findall/3 驱动一个简单的循环,如果 Goal (参数2)使用 member/2 是的。在这种情况下,我们正在统一 day(D) 对于列表中的每一项;除了统一之外,实际上不需要做任何进一步的工作,因此我们可以使用 成员/2 但是你可以在这里通过插入参数来驱动一个更复杂的循环。假设你想改变 day day-of-week ,例如:

    ?- findall(DoW, (member(day(D), 
                     [day(monday), day(tuesday)]), DoW=day_of_week(D)), 
               Days).
    Days = [day_of_week(monday), day_of_week(tuesday)].
    

    换言之,只要你用括号括起来,让目标变得更复杂就行了。

    第二个技巧是特定于swi prolog(或者logtalk,如果可以使用的话),这是新的 library(yall) 以下内容:

    ?- maplist([Wrapped,Day]>>(Wrapped=day(Day)),
              [day(monday),day(tuesday)], X).
    X = [monday, tuesday].
    

    library(yall) 使您能够编写匿名谓词。 [Wrapped,Day]>>(Wrapped=day(Day)) 有点像内联谓词,在这里做的正是@lurker的 day_name/2 谓词正在执行,但在 maplist/3 调用本身而不需要是单独的谓词。一般语法看起来像 [Variables...]>>Goal 是的。这种东西以前是 library(lambda) 多年来一直是logtalk的特色。