如果列表中的元素为真,则返回true

时间:2015-02-25 14:42:29

标签: list oz mozart

我需要在奥兹做两个非常相似的练习:

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

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

我不确定的是,如果我有这样的函数,我怎么能让它返回true或false:

    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是真的,所以它必须返回true

2 个答案:

答案 0 :(得分:1)

一些提示:

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

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

答案 1 :(得分:0)

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

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

最后一件事:Oz中的行注释采用此格式andthen,而不是像斜杠一样。

对不起,我的答案很长,对于我的英文,代码应该是:

andthen