Простой предикат, который возвращает все возможные разбиения списка - PullRequest
0 голосов
/ 24 марта 2020

В прологе, не используя никаких предопределенных предикатов, как можно go найти все возможные способы разбиения списка на 2 других списка.

Например, после запуска all_possibilities([apple, ball, cat, dog], A, B). Я хочу

A = []
B = [apple, ball, cat, dog]

A = [apple, ball, cat]
B = [dog]
...

A = [cat, dog]
B = [apple, ball]

A = [dog]
B = [apple, ball, cat] 

A = [apple, ball, cat, dog]
B = [] 

У меня есть приблизительное представление о том, как go об этом теоретически, но изо всех сил пытаюсь его реализовать. Я знаю, что мне нужно использовать рекурсию, и я пытаюсь исправить один элемент, а затем назначить остальные.

Например, начать с заголовка списка в B, а затем рекурсивно сделать то же самое для хвоста, чтобы все элементы были в B Затем, когда последний вызов завершается, хвост должен go в A.

Эквивалентно, этот предикат будет истинным, если A и B составляют первый список.

Я не Я действительно знаю, как выразить это словами, но любая помощь приветствуется. Дайте мне знать, если я смогу добавить дополнительную информацию и / или если я допустил какие-либо ошибки.

(редактировать: хотя append довольно близок, моему предикату нужно будет добавить ([2], [3,1 ], [1,2,3]), например, для возврата true, которое не будет добавлено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...