2016-10-09 58 views
2

我正在通過learnprolognow學習Prolog。目前我在第四章,並且卡在the second exercise上。Prolog - combine2如何防止在末尾添加空列表

「現在寫一個3元謂詞combine2這需要三個列表作爲參數,並結合了前兩個列表的元素融入到第三如下:

?- combine2([a,b,c],[1,2,3],X).  
X = [[a,1],[b,2],[c,3]] " 

我的實現是:

combine2([],[],[]). 
combine2([H1|T1],[H2|T2],[[H1,H2],R]):- 
    combine2(T1,T2,R). 

以上壽查詢的結果是:

X = [[a, 1], [[b, 2], [[c, 3], []]]] ; 

我不知道如何重新編寫它,所以在最後一步,程序不會添加空列表。我接受建議/提示/解決方案。

謝謝,祝你有個愉快的週日!

回答

3

在你的實現中:[[H1,H2],R]是一個包含元素[H1,H2]和元素R的元素的列表。你需要寫的是[[H1,H2]|R],它代表頭元素[H1,H2]的列表,剩下的列表R將被遞歸實例化。請注意,行[[H1,H2],R]不僅導致一個空的列表到最後,但它也嵌套列表,因爲你沒有得到X = [[a, 1], [b, 2], [c, 3], []] ;(它只是一個空列表),但嵌套列表如下:X = [[a, 1], [[b, 2], [[c, 3], []]]] ;

+0

謝謝!是的,這是完全合理的。 – InDaPond

+0

我只是認爲在頭部只能有1個元素。那是不是真的?或者「one」元素也可以是一個變量? – InDaPond

+0

Head是列表中的第一個元素,它是一個當前在列表中實例化的變量,例如子句combine2([H1 | T1],[H2 | T2],[[H1,H2],R])): -...用其他列表的已知頭H1,H2實例化頭元素[H1,H2](這是一個變量)。頭是一個元素,但是這個元素可能與你的情況類似於[H1,H2]形式的列表,或者在其他示例中可能是形式元素(H1,H2)或H1-H2並繼續。 ... – coder

2

你只改變一個char:|代替,[[H1,H2],R]:我的意思是,[[H1,H2]|R]代替[[H1,H2],R]

如果你使用一個逗號,你創建了有兩個元素的新列表:(一)R

如果您使用的管道,插入列表[H1,H2]和(b)列表(在第一位置)列表[H1, H2],其次是R中的元素。

相關問題