выполнить расшифровку длины списка в прологе? - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь декодировать данный список, например, mydecode ([(a, 1), (b, 2), (c, 3), (d, 2)], X) должен дать X = [ 'а', 'б', 'B', 'c', 'c', 'c', 'd', 'd']. В чем ошибка в этом коде?

mydecode([],[]).
mydecode([X|Ys],[X|Zs]) :- \+ is_list(X), mydecode(Ys,Zs).
mydecode([[1,X]|Ys],[X|Zs]) :- mydecode(Ys,Zs).
mydecode([[N,X]|Ys],[X|Zs]) :- N > 1, N1 is N - 1, mydecode([[N1,X]|Ys],Zs).

1 Ответ

2 голосов
/ 25 апреля 2020
  • вас просят обработать список 'кортежей' из 2 элементов, а не список списков из 2 элементов
  • , тогда тест во втором предложении всегда будет неудачным
  • элементы кортежей key и value, но вы «обращаетесь» к ним в обратном порядке.

Итак, удалите второе предложение - это не имеет значения, так как сопоставление с образцом отбрасывает плохо сформированные списки. Измените [1,X] на (X,1) и аналогичные другие ссылки на кортежи и протестируйте свой код с назначенным запросом.

...