Вернуть истину, если элемент в списке является истинным 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}}
Другие вопросы по тегам