Ваш код немного необычный, он создает список "лениво" ...
?- order(X), write(X).
[]
X = [] ;
[_G357]
X = [_G357] ;
[person2,person1]
X = [person2, person1] ;
[person2,person3]
X = [person2, person3] ;
[person2,person3,person1]
X = [person2, person3, person1] ;
[person2,person3,person4]
X = [person2, person3, person4] .
....
, а затем требуется встроить «все решения», но findall / 3, примененный к нему, дает:
?- findall(X,order(X),L).
L = [[], [_G1108], [person2, person1], [person2, person3], [person2, person3, person1], [person2, person3, person4], [person2, person3|...], [person2|...], [...|...]|...].
Вы можете рассмотреть возможность сокращения кода, используя более непосредственное использование любого из встроенных модулей «все решения».
В любом случае, когда запись или формат не подходят, я использую maplist. В сочетании с библиотекой (лямбда) вы получаете управление довольно компактным способом: например, для отображения отсортированных данных:
?- setof(Y-P, Y^P^born(P, Y), L), maplist(writeln, L).
1965-person2
1966-person3
1967-person4
1968-person5
1969-person6
1991-person1
L = [1965-person2, 1966-person3, 1967-person4, 1968-person5, 1969-person6, 1991-person1].
Здесь setof / 3 строит список, отсортированный по году, затем с помощью лямбды мы можем восстановить поле интереса.
?- setof(Y-P, Y^P^born(P, Y), L), maplist(\E^(E=(Y-P), writeln(P)), L).
person2
person3
person4
person5
person6
person1
L = [1965-person2, 1966-person3, 1967-person4, 1968-person5, 1969-person6, 1991-person1].