В прологе, не используя никаких предопределенных предикатов, как можно 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, которое не будет добавлено)