我有以下代码:
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)
答案 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的内容。