【问题标题】:Two clause definition to find the maximum number on a list两个子句定义以查找列表中的最大数量
【发布时间】:2022-05-09 17:19:20
【问题描述】:

我将如何编写一个包含两个子句的递归定义来查找列表中的最大值。到目前为止,我已经写了这个:

 max(L,M):-  

 max([H|T],M):-

max(T,H,M).
max([],M,M).
max([H|T],Y,M):-
   H =< Y,
   max(T,Y,M).
max([H|T],Y,M):-
   H > Y,
   max(T,H,M).

这不起作用,它说有一个我看不到的语法错误,而且我知道它也不是两个子句。有谁知道我可以如何简化它以使其成为两个子句?

【问题讨论】:

  • 如果这是作业,您应该在问题中添加“作业”标签。
  • 不,这不是作业,这只是我在尝试使用 prolog 时遇到的一个基本困难。

标签: prolog


【解决方案1】:

和你一样,我使用“最大”名称作为谓词。此实现不依赖任何内置谓词:

max([X],X).
max([X|Xs],X):- max(Xs,Y), X >=Y.
max([X|Xs],N):- max(Xs,N), N > X.

【讨论】:

  • 在第一行末尾加上cut会更高效:max([X],X):-!.
【解决方案2】:

语法错误是因为前两个子句没有正文。

要回答您的问题,请注意列表的最大值可以归纳定义如下:

  • 具有一个元素的列表的最大值就是那个元素。
  • 具有多个元素的列表的最大值是头部的最大值和尾部的最大值。

因此,

max_list([H], H).
max_list([H|T], M2) :- 
  max_list(T, M),
  M2 is max(H, M).

此代码使用max/2SWI-PrologGNU-Prolog)。请注意,大部分或所有 Prolog 实现都会有一个内置函数max_list/2SG),所以实际上不需要自己定义。

编辑: Bakore notes 尾递归实现可能更有效。您可以通过定义一个谓词 max_list/3 来实现这一点,该谓词接受一个附加参数 C,即目前看到的最大值。

max_list([H|T], M) :- max_list(T, H, M). 

max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).

【讨论】:

    【解决方案3】:

    这是列表列表中最大的解决方案

    max_list([], C, C).
    max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).
    
    max_list([], []).
    max_list([[H|HB]|B],[RH|RB]) :- max_list(HB, H, RH), max_list(B, RB).
    
    ex: max_list([[1,3,6], [6,3,8,2],[2,1,0]]).
    

    【讨论】:

      【解决方案4】:

      num=INTEGER
      list = num*
      

      谓词

      nondeterm maxList(list,num)
      

      条款

      maxList([A],A).   
      maxList([A|List],Max):- Max=A,maxList(List,Max1),A>=Max1.  
      maxList([A|List],Max):- Max=Max1,
      maxList(List,Max1),A< Max1.
      

      目标

      maxList([1,2,3,5,4],Max).
      

      【讨论】:

        【解决方案5】:

        这个肯定有用

        l:-listing.
        m(L,X):-aku2(L,0,X).
        aku2([],B,B).
        aku2([G|O],Maks,C):-maks(Maks,G,Maks1),aku2(O,Maks1,C).
        maks(A,B,C):-A>B, C is A.
        maks(A,B,C):-A=<B, C is B.
        

        【讨论】:

          【解决方案6】:

          我认为下面的代码可以解决问题:

          max_list([],0).
          max_list([H],H).
          max_list([H|T],M):- max_list(T,M1),M is max(H,M1).
          

          【讨论】:

          • max_list([-1],M) 应该是什么?根据您的定义:M = 0M = -1
          【解决方案7】:

          我知道这个问题很老,但这里有一个使用 if-then-else 结构的答案:

          maxmember([X],X).
          maxmember([H|T],Max) :- maxmember(T, M),(H>M -> Max is H ; Max is M).
          

          【讨论】:

            【解决方案8】:

            最大(0,[])。

            最大(R,[H|T]):-

            max(Y,T),
            H > Y,
            R is H.
            

            最大(R,[H|T]):-

            max(Y,T),
            H =< Y,
            R is Y.
            

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            【解决方案9】:
            list([H],H).
            list([H1,H2|T],X):-H1>H2,list([H1|T],X).
            list([_|T],X):-list(T,X).
            

            目标:list([3,9,4,5],M)

            输出:M=9

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-24
              • 2012-04-18
              • 1970-01-01
              • 1970-01-01
              • 2016-12-03
              • 2018-01-16
              相关资源
              最近更新 更多