2015-10-29 33 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