Функция, которая проверяет, что первый список является началом списка 2

Я пытаюсь создать функцию, которая принимает два списка и проверяет, является ли первый список началом второго списка. У меня такой псевдокод:

  • пустой список начинает список
  • список не начинается с пустого списка
  • список начинает второй список, если они имеют ту же самую начало и конец второго списка

Может ли кто-нибудь объяснить хороший способ решения этой проблемы?

для первого оператора псевдокода я подумал сделать что-то вроде:

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;

person Chris    schedule 27.10.2015    source источник
comment
Ваш подход в порядке. Для последней строки ((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2)) вы хотели бы иметь рекурсивный вызов, чтобы продолжить оценку для последующих элементов, пока вы не дойдете до шаблона [] l2   -  person Kevin Johnson    schedule 28.10.2015
comment
Кроме того, нет необходимости использовать оператор if. ((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
comment
ой .. Я хочу сказать: так что напишите ((hd(l1) = (hd(l2) andalso (tl(l1) = (tl(l2)) и теперь придумайте способ продолжить рекурсивный вызов с этого момента. Еще один совет: вы заменяете (tl (l1) = (tl (l2)) чем-то другим, поскольку вам нужно сравнивать по одному элементу за раз.   -  person Kevin Johnson    schedule 28.10.2015
comment
В конце концов мне это удалось. Я обновлю код. Спасибо за помощь! В конце концов, я все еще использовал оператор if, но мог бы попробовать и без него.   -  person Chris    schedule 28.10.2015
comment
Сейчас я пытаюсь выяснить, содержит ли один список элементы другого списка. Не могли бы вы подсказать, как это сделать?   -  person Chris    schedule 28.10.2015
comment
Ваша текущая функция уже проверяет это. Что ты имеешь в виду?   -  person Kevin Johnson    schedule 28.10.2015
comment
Извините, я недостаточно ясно выразился, но это уже не имеет значения, мне удалось решить эту проблему. Но все равно спасибо за вашу помощь :)   -  person Chris    schedule 28.10.2015


Ответы (1)


С сопоставлением с образцом, но без условных обозначений:

fun start [] l2 = true 
  | start l1 [] = false 
  | start (x::xs) (y::ys) = x = y andalso start xs ys
person molbdnilo    schedule 27.10.2015
comment
Не могли бы вы взглянуть на мой последний вопрос? Речь идет об удалении списка из другого списка. В моем посте это имеет больше смысла. Если бы вы могли, это было бы здорово! Спасибо. - person Chris; 28.10.2015