Вернуть истину, если элемент в списке является истинным Oz
Мне нужно сделать два очень похожих упражнения в Оз:
*. Напишите функцию {Some L P}, которая принимает список L и булеву функцию P. Она возвращает истину, если P возвращает истину хотя бы для одного элемента из L, и ложь в противном случае.
*. Напишите функцию {All L P}, которая возвращает true тогда и только тогда, когда P истинно для всех элементов в L.
я не уверен, что если у меня есть такая функция, как я могу заставить ее возвращать 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 ответа
Некоторые намеки:
Сначала подумайте о желаемом результате в случае пустого списка. На данный момент вы возвращаетесь nil
, Вы, вероятно, должны вернуться false
, Потому что в пустом списке не может быть никакого элемента, который выполняет предикат.
Затем подумайте о случае, когда вы нашли один элемент, для которого истинно P. Я не думаю, что вам нужно перебирать остальную часть списка...
В функции Some
вы возвращаете значение nil в случае пустого списка, но вы хотите, чтобы функция возвращала логическое значение, поэтому оно должно быть ложным, поскольку пустой список не может точно выполнить P
функция, что бы это ни было. Затем, как только вы найдете элемент, который удовлетворяет P
нет необходимости проверять оставшуюся часть списка. Вы можете использовать оператор Oz orelse
, это работает как логика или оператор, но оценивает второй аргумент, только если первый является ложным.
Функция {All L P}
будет работать аналогичным образом, теперь вы можете прекратить проверку списка, когда найдете элемент, который не удовлетворяет P
, так что вы можете использовать оператор Oz andthen
, Единственное отличие состоит в том, что теперь вы должны проверить, когда список состоит из одного элемента (та же проблема, что и при оценке последнего), потому что функция на следующем шаге будет оценивать нулевой элемент, возвращающий false, делая false все значения функции в andthen
заявление.
Последнее, что: строчные комментарии в Оз в этой форме % 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}}