【问题标题】:How to print out all the solutions in Prolog?如何打印出 Prolog 中的所有解决方案?
【发布时间】:2013-03-04 14:50:16
【问题描述】:

我正在尝试打印包含问题的所有解决方案的列表,但 Prolog 只给了我部分解决方案,并且像这样在中间切断:

[[something-something], [something-something], [something-something], [...-...], [...][...].

如何让 Prolog 打印所有解决方案?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    我使用 maplist/2

    ?- numlist(1,10,L),maplist(writeln,L).
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].
    

    如果您正在运行 SWI-Prolog,您可以指示它避免省略号

    ?- [user].
    |: no_ellipsis :-
    |:     current_prolog_flag(toplevel_print_options, V),
    |:     select(max_depth(_), V, U),
    |:     set_prolog_flag(toplevel_print_options, U).
    |: end_of_file.
    |: % user://3 compiled 0,05 sec, 1 clauses
    true.
    
    ?- no_ellipsis.
    true .
    
    ?- numlist(1,20,L).
    L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20].
    

    这样的规则可以放在启动文件中,(在 Unix 上是 ~/.plrc)

    或者你可以使用写谓词

    ?- numlist(1,20,L),format('~w',[L]).
    [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
    L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].
    

    【讨论】:

      【解决方案2】:

      你只需要写出来。 SWI-Prolog 中默认的交互式漂亮打印机这样做是为了避免让您淹没在输出中。所以,如果你现在正在做:

      ?- foo(X).
      X = [[something-something], [something-something], [something-something], [...-...], [...][...].
      

      改为这样做:

      ?- foo(X), write(X), nl.
      ... the complete output ...
      X = [[something-something], [something-something], [something-something], [...-...], [...][...].
      

      例如:

      ?- length(X, 10), write(X), nl.
      [_G1607,_G1610,_G1613,_G1616,_G1619,_G1622,_G1625,_G1628,_G1631,_G1634]
      X = [_G1607, _G1610, _G1613, _G1616, _G1619, _G1622, _G1625, _G1628, _G1631|...].
      

      【讨论】:

        猜你喜欢
        • 2016-03-23
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多