如何在Prolog中将给定事实合并到列表中

如何在Prolog中将给定事实合并到列表中,prolog,Prolog,我有三个事实 myfact1(1,'Hamburg','Berlin', 315). myfact2(2,'Kiel','Bremen', 175). myfact3(3,'Essen', 'Oberhausen',50). 我想以列表的元组形式给出我的事实的信息。我对 输出(列表)应给出如下列表: [('Hamburg', 'Berlin', 315),('Kiel','Bremen',175),('Essen','Oberhausen',50)] 如何在Prolog中实现规则output

我有三个事实

myfact1(1,'Hamburg','Berlin', 315).
myfact2(2,'Kiel','Bremen', 175).
myfact3(3,'Essen', 'Oberhausen',50).
我想以列表的元组形式给出我的事实的信息。我对
输出(列表)
应给出如下列表:

[('Hamburg', 'Berlin', 315),('Kiel','Bremen',175),('Essen','Oberhausen',50)]

如何在Prolog中实现规则
output/1
我不知道我是否理解正确,但我会将事实改为“myfact1”,而不是myfact1。在这种情况下:

output(List) :-
    findall(myfact(A,B,C,D),myfact(A,B,C,D),List).
如果您真的想保留MyFact1,…:

output(List) :-
    myfact1(A1,A2,A3,A4),
    myfact2(B1,B2,B3,B4),
    myfact3(C1,C2,C3,C4),

    append([myfact1(A1,A2,A3,A4),myfact2(B1,B2,B3,B4),myfact3(C1,C2,C3,C4)],[],List).

当然还有更好的解决方法。

你的事实定义得不清楚。为什么每一个都是不同的函子?这使得处理数据变得不必要的复杂,因为您需要以编程方式构造functor来查询事实。您有
myfact1
myfact2
myfact3
,而每个都应该是
myfact
。除非你真的需要索引事实,否则你也不需要第一个整型参数。然后您可以使用聚合谓词,如
findall((A,B,C),myfact(u,A,B,C),L)
。使用
append
是一种相当复杂或笨拙的方法,可以将所需列表与变量统一起来。你可以说,
List=[myfact1(A1,A2,A3,A4),myfact2(B1,B2,B3,B4),myfact3(C1,C2,C3,C4)]
@Nickelium抱歉,这实际上只是我的事实,但有50多个事实,所以我需要重新整理一下这个事实,事实的第一个元素以1开头,最后一个事实以50结尾。因此,我必须检查50个事实,并将其附加到我的输出列表中。我需要像x=x+1这样的东西来把rekursiv从第一个事实转到第二个事实,依此类推。实际问题似乎是这样的:komponist(11,'Georg Friedrich','Händel',1685,1759)。komponist(12,'Serge','Prokofiev',18911953)。komponist(13,'Claudio','Monterverdi',15671643)。komponist(14,'Antonin','Dvorak',18411904)。komponist(15,'安东尼奥','维瓦尔第',16781741)。komponist(16,'利奥波德','莫扎特',17191787)。komponist(17,'Heinrich Ignaz Franz','Biber',1644,1704)。collect_komp(Output)的实现应该使其输出为[('Georg Friedrich','Händel',16851759),('Serge','Prokofiev',18911953),…])。在这种情况下,与我在回答中所写的内容相比没有太大区别:collect_komp(Output):-findall((A,B,C,D),komponist('A,B,C,D),Output)。