2014-10-06 93 views
2

我的任務是這樣的:編寫一個讀取整數x和整數列表L;然後將x所有位置的列表定位到L,並返回結果列表。例如,對於x=2L=[1,2,3,4,2,5,2,6]程序應返回列表R=[2,5,7]在Prolog中查找列表中的值的所有位置

到目前爲止,我已經能夠寫一個indexOf謂:

indexOf([E|_], E, 1). 
indexOf([_|T], E, I) :- indexOf(T, E, I2), I is I2 + 1. 

然而,這並不能「迴歸」的列表。所以:

indexOf([a,b,c,a,d], a, R). 
R = 1; 
R = 4 

我想要做這樣的事情:

findAll([a,b,c,a,d], a, R). 
R = [1, 4] 

但我不知道如何收集值成一個列表。

這是一個學校作業,所以我只想欣賞一下正確的方向。

回答

1

微調:你找到指數,但你不收集它們。

indices(List, E, Is) :- 
    indices_1(List, E, Is, 1). 

對於空表,索引列表是空的, 和元素不要緊

indices_1([], _, [], _). 

如果該元素是一樣的頭,收集指標。

indices_1([E|Xs], E, [I|Is], I) :- 
    I1 is I + 1, 
    indices_1(Xs, E, Is, I1). 

這需要另一個條款才能正常工作。

編輯:

一種方式做到這一點是:

indices_1([X|Xs], E, Is, I) :- dif(X, E), 
    I1 is I + 1, 
    indices_1(Xs, E, Is, I1). 

在前款規定,在名單的頭和元素是統一的。在這個條款中,它們明顯不同。這意味着對於第一個參數列表中的一個元素,這兩個子句中只有一個可以爲真。

編輯:

另一種方法是使用findallnth1

indices(List, E, Is) :- 
    findall(N, nth1(N, List, E), Is). 
+0

謝謝!我添加了這個子句:'indices_1([_ | T],E,Is,I): - I1是I + 1,indices_1(T,E,Is,I1)。' – 2014-10-06 19:52:30

+0

您的解決方案只返回完整列表(例如'R = 1,3]'),而我的每一步都返回它(例如'R = [1,3]; R = [1]; R = [3],R = []')。爲什麼會這樣呢? – 2014-10-06 20:10:13

+0

@AndrewBurgess查看我的編輯 – 2014-10-06 20:30:12