2012-03-13 133 views
3

我想寫一個prolog程序,其行爲方式如下: 它枚舉所有可能的連續(我不知道這是否是適當的短語,即[a,c]是不是[a,b,c]子列表),子列表的長度,從正確列表的第一個元素到子列表的第一個元素的距離,以及從子列表的最後一個元素到最後一個元素的距離正確列表的元素。 所以輸入/輸出理想的情況是這個樣子:枚舉prolog的子列表

| ?- sublist([a,b], SubList, Before, Len, After). 
    SubList= [], After = 2, Before = 0, Len = 0 ? ; 
    SubList= [a], After = 1, Before = 0, Len = 1 ? ; 
    SubList= [a,b], After = 0, Before = 0, Len = 2 ? ; 
    SubList= [], After = 1, Before = 1, Len = 0 ? ; 
    SubList= [b], After = 0, Before = 1, Len = 1 ? ; 
    SubList= [], After = 0, Before = 2, Len = 0 ? ; 

到目前爲止,我可以輸出的子列表正確,並輸出其長度,就像這樣:

sublist(L,S,Len) :- 
    append(_,L2,L), %getting sublist 
    append(S,_,L2), %getting sublist 
    length(S,Len). %getting length of sublist 

,但我有麻煩搞清楚我如何跟蹤'之前'和'之後'。 看起來像一個(也許是偷偷摸摸的)的方法是從-1開始B並在每次遇到[] -valued子列表時將'Before'加1(因爲遇到[]意味着頭部具有已經被刪除,現在我們只是從尾部開始),一旦你有'之前','之後'將只是([輸入列表的長度] - '之前' - [子列表的長度] )。不幸的是,我完全喪失瞭如何去增加「之前」的方法。 有什麼想法?非常感謝! :)

回答

3

到目前爲止,我可以輸出的子列表正確,並輸出其長度,像這樣[...]

你幾乎得到了它。

只需綁定前綴和後綴變量,並確保前綴的長度是Before和後綴的長度爲After

sublist_lengths(L, SubList, Before, Len, After) :- 
    append(PrefSub, Suffix, L), 
    append(Prefix, SubList, PrefSub), 
    length(SubList, Len), 
    length(Prefix, Before), 
    length(Suffix, After). 
+0

啊!現在有道理:)非常感謝你的幫助! – user1257768 2012-03-13 19:18:28

+0

沒問題。別客氣。 – aioobe 2012-03-13 19:21:31