1

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

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

*。编写函数 {All LP},当且仅当 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 为真,所以它必须返回真

4

2 回答 2

1

一些提示:

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

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

于 2015-02-25T16:48:17.767 回答
0

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

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

最后一件事:Oz 中的行注释采用这种形式% 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}}
于 2015-02-26T17:50:47.477 回答