【问题标题】:Prolog program to find the minimum and next minimum in a listProlog 程序在列表中查找最小值和下一个最小值
【发布时间】:2015-12-09 23:38:45
【问题描述】:

我想创建一个 prolog 程序,以便它可以在列表中搜索最小数字,并且当用户要求更多解决方案(使用 ; 符号)时,程序返回下一个最小数字。如果用户要求另一个解决方案,它会返回下一个数字,依此类推。我已经创建了最小谓词,但无法回溯以获得更多结果,请帮助。

提前致谢。

P.S 我正在使用 Swi-prolog

【问题讨论】:

    标签: prolog


    【解决方案1】:

    我们根据list_minnum/2tfilter/3dif/3定义list_nextmin_gt/3

    list_nextmin_gt(Zs0, M, Zs) :-
       list_minnum(Zs0, M0),
       tfilter(dif(M0), Zs0, Zs1),
       (  M0 = M, 
          Zs = Zs1
       ;  list_nextmin_gt(Zs1, M, Zs)
       ).
    

    示例查询:

    ?- list_nextmin_gt([3,2,1,2,3], M, Rest).
    (  M = 1, Rest = [3,2,2,3]
    ;  M = 2, Rest = [3,3]
    ;  M = 3, Rest = []
    ;  false
    ).
    

    或者,如果您不关心剩余的列表项,只需编写:

    ?- list_nextmin_gt([3,2,1,2,3], M, _).
    (  M = 1
    ;  M = 2
    ;  M = 3
    ;  false
    ).
    

    【讨论】:

    • @false。或者应该是“(”“)”。也去吗?
    • 也是。它没有帮助:没有那样提到arity。所以你需要一个额外的参考来提及谓词指示符。
    • @false。 (;)/2 的数量?我想知道a ; b ; false(a ; b ; c) 有什么不同...... :- M=1 ; M=2 ; M=3 ; false. 作为答案怎么样?
    【解决方案2】:

    非常简单的解决方案:对列表进行排序并返回该列表的每个成员:

    min(List, Min) :-
        sort(List, Sorted),
        member(Min, Sorted).
    

    【讨论】:

      猜你喜欢
      • 2017-09-19
      • 2011-04-27
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2015-06-29
      相关资源
      最近更新 更多