Я пытаюсь создать функцию, которая принимает два списка и проверяет, является ли первый список началом второго списка. У меня такой псевдокод:
- пустой список начинает список
- список не начинается с пустого списка
- список начинает второй список, если они имеют ту же самую начало и конец второго списка
Может ли кто-нибудь объяснить хороший способ решения этой проблемы?
для первого оператора псевдокода я подумал сделать что-то вроде:
fun starts [] l2 = false |
starts l1 [] = false |
starts l1 l2 = if ((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2)) then true
Я не совсем уверен, сработает ли это, как если бы хвост второго списка был длиннее, чем хвост первого списка? произошла бы ошибка?
Если бы кто-то мог помочь объяснить или даже найти решение, это было бы здорово!
РЕДАКТИРОВАТЬ:
Нашел способ сделать это, не думаю, что я был слишком далеко.
Fun start [] l2 = true |
start l1 [] = false |
start l1 l2 = if (hd(l1)) = (hd(l2)) then (start (tl(l1)) (tl(l2))) else false;
((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2))
вы хотели бы иметь рекурсивный вызов, чтобы продолжить оценку для последующих элементов, пока вы не дойдете до шаблона[] l2
- person Kevin Johnson   schedule 28.10.2015((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2))
эквивалентноif ((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2)) then true else false
. Так что напишитеif ((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2)) then true
и теперь придумайте способ продолжить рекурсивный вызов с этого момента. Также первая строка должна быть истинной, а не ложной. - person Kevin Johnson   schedule 28.10.2015((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2))
и теперь придумайте способ продолжить рекурсивный вызов с этого момента. Еще один совет: вы заменяете (tl (l1) = (tl (l2)) чем-то другим, поскольку вам нужно сравнивать по одному элементу за раз. - person Kevin Johnson   schedule 28.10.2015