【问题标题】:Return true if an element in a list is true Oz如果列表中的元素为真则返回真 Oz
【发布时间】:2015-04-27 14:46:56
【问题描述】:

我需要在 Oz 中做这两个非常相似的练习:

*。编写函数 {Some L P},它接受​​一个列表 L 和一个布尔函数 P。如果 P 对 L 的至少一个元素返回 true,则返回 true,否则返回 false。

*。编写函数 {All L P} 当且仅当 P 对于 L 中的所有元素都为真时返回真。

我不确定如果我有这样的函数,我怎样才能让它返回真或假:

    declare
fun{P X} //bolean function
   if X==2 then true
   else false
   end
end

fun{Some L P} //Some function
   case L
   of nil then nil
   [] X|Xr then
      if {P X} == true then X|{Some Xr P}
      else {Some Xr P}
      end
   end
end

{Browse {Some [1 2 3] P}} 

2 为真,所以它必须返回真

【问题讨论】:

    标签: list oz mozart


    【解决方案1】:

    一些提示:

    首先,考虑在空列表的情况下所需的结果。目前,您正在返回nil。您可能应该返回false。因为在空列表中,不可能有任何元素满足谓词。

    然后想想你找到了一个 P 为真的元素的情况。我认为您不必遍历列表的其余部分...

    【讨论】:

      【解决方案2】:

      在函数 Some 中,如果列表为空,则返回 nil 值,但您希望函数返回布尔值,因此它应该为 false,因为空列表肯定不能满足 P 函数, 不管是什么。然后,一旦找到满足P 的元素,就无需检查列表的其余部分。您可以使用 Oz 运算符 orelse,它用作逻辑或运算符,但仅当第一个参数为 false 时才计算第二个参数。

      函数{All L P} 将以类似的方式工作,现在您可以在找到不满足P 的元素时停止检查列表,因此您可以使用Oz 运算符andthen。唯一的区别是现在您必须检查列表何时由一个元素组成(评估最后一个元素时同样的问题),因为下一步的函数将评估一个返回 false 的 nil 元素,使所有函数值在andthen 声明。

      最后一件事:Oz 中的行 cmets 采用这种形式 % My comments,而不是像斜杠那样。

      对不起,我的回答太长了,我的英语应该是:

      declare
      fun{P X}
         if X==2 then true
         else false
         end
      end
      
      fun{Some L P}
         case L
         of nil then false
         [] X|Xr then {P X} orelse {Some Xr P}
         end
      end
      
      fun{All L P}
         case L
         of nil then false
         [] [X] then {P X}
         [] X|Xr then {P X} andthen {All Xr P}
         end
      end  
      
      {Browse {Some [1 2 5] P}} 
      {Browse {All [2 2 2 2] P}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-12
        • 2021-10-15
        • 2020-01-13
        • 2017-04-01
        • 2017-07-28
        • 2022-11-25
        • 2016-08-28
        • 2016-05-03
        相关资源
        最近更新 更多