我需要在奥兹做两个非常相似的练习:
*。编写带有列表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
答案 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