如何在prolog中显示列表的内容?

时间:2012-03-04 11:14:02

标签: list lambda prolog

我有以下代码:

 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 个答案:

答案 0 :(得分:2)

你的代码有点不寻常,它会'懒洋洋地'建立一个列表......

?- 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。与library(lambda)配对,您可以以相当紧凑的方式获得控制权:例如,显示您的数据分类:

?- 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构建一个按年份排序的列表,然后使用lambda我们可以恢复感兴趣的字段。

?- 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].

答案 1 :(得分:0)

不应write/1吗?您的示例似乎没有显示打印行为,因此您只需使用正确的参数调用order(按顺序生成,手动或创建另一个谓词来生成它),Prolog系统应显示X的内容。