2015-10-29 29 views
-1

我有3个事实。如何合并序言中的列表中的已知事实

myfact1(1,'Hamburg','Berlin', 315). 
myfact2(2,'Kiel','Bremen', 175). 
myfact3(3,'Essen', 'Oberhausen',50). 

我想给myform的信息作为List的元组。我的 output(List)查询应该给像列表:

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

如何在Prolog的实施规则output/1

+1

您的事实定义不清。为什么每个人都是不同的仿函数?这使得处理数据不必要的复杂,因为您需要以编程方式构造函数来查询事实。你有'myfact1','myfact2'和'myfact3',而每个只是'myfact'。除非你真的需要索引事实,否则(不一定)需要第一个整数参数。然后你可以使用聚合谓词,如'findall((A,B,C),myfact(_,A,B,C),L)'。 – lurker

回答

0

我不知道如果我理解正确的,但我会改变的事实,以“myfact”代替myfact1。在这种情况下:

output(List) :- 
    findall(myfact(A,B,C,D),myfact(A,B,C,D),List). 

如果你真的想保持myfacts1,...:

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). 

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

+1

你使用'append'是一种相当复杂或者很呆板的方式来将所需的列表与一个变量统一起来。你可以说,'List = [myfact1(A1,A2,A3,A4),myfact2(B1,B2,B3,B4),myfact3(C1,C2,C3,C4)]''。 – lurker

+0

您提供的代码至少有一个语法错误。 – repeat

+0

@Nickelium对不起,其实只是我的事实,但有超过50个事实,所以我需要通过事实去Rekursiv,事实的第一个元素从1开始,最后的事实结束于50。所以我必须经历50个事实并将其追加到我的输出列表中。我需要像x = x + 1这样的东西,从第一个事实再到第二个事件,依此类推。 – biraj01