Как вы показываете содержимое списка в прологе? - PullRequest
0 голосов
/ 04 марта 2012

У меня есть следующий код:

 born(person1,1991).

 born(person2,1965).

 born(person3,1966).

 born(person4,1967).

 born(person5,1968).

 born(person6,1969).


 criteria(X,Y):- born(X,Z) , born(Y,T) , Z<T.
 order([]).  

 order([X]).  

 order([X,Y|L]) :- criteria(X,Y),order([Y|L]). 

У меня есть порядок предикатов ([X, Y | L), который является истинным, если список упорядочен, в этом случае первый элемент должен быть самым старым человеком, а последний элемент должен быть самым молодым человеком.

Мой вопрос: как бы вы сделали предикат print_List / 1, который позволяет вам печатать содержимое списка. Пример того, как это должно работать:

  ?-print_List([X]).
  X = [person2, person3, person4, person5, person6, person1)

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Ваш код немного необычный, он создает список "лениво" ...

?- 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].
0 голосов
/ 04 марта 2012

не должен write/1 делать? Ваш пример, кажется, не показывает поведение печати, поэтому вы можете просто вызвать order с правильным параметром (order born, либо вручную, либо создать другой предикат для его генерации), и система Prolog должна показать содержимое X.

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