2016-12-13 70 views
0

我的目標是創建一個謂詞,用於檢查給定列表是否包含佔用其他列表中某些位置的元素。ECLiPSe謂詞用於檢查列表是否包含另一個列表中某些位置的元素

更精確地,我想找當且僅當列表L有在它的內部元件,其表示一個NxN陣列A通過平面化列表C表示的行這將是真正的謂詞。例如,如果A = [[0,1],[1,1]], C = [0,1,1,1], L = [1,1], N=2,那麼predicate(L,C,2)應該是正確的。

我嘗試看起來如下(假設是L具有至少2個元素):

row([H1,H2|T],C,N) :- M is N*N-N+1, X::1..M, X #= N*_ + 1, 
         nth1(X,C,H1), Y is X+1, nth1(Y,C,H2), 
         nextr([H2,T],C,Y). 

nextr([H1,H2|T],C,Y) :- nth1(Y,C,H1), Z is Y+1, nth1(Z,C,H2), 
         nextr([H2,T],C,Z). 

nextr([H1,H2],C,Y) :- nth1(Y,C,H1), Z is Y+1, nth1(Z,C,H2). 

row謂詞可以確保的L第一元件發生在C,它表示的一個開始的位置新排在排列A中,另外還檢查下一個L元素是否也是C中的下一個元素。然後,nextr謂詞只檢查後一個條件。

在我看來,這應該工作得很好。可悲的是 - 它並不像row([0,1],[0,1,1,1],2).輸出No :(

編輯:好吧,這是我注意到一個愚蠢的例子,但反正 - 它不row([1,2,3],[1,2,3,4,5,6,7,8,9],1). BT其輸出Yesrow([1,2|3],[1,2,3,4,5,6,7,8,9],1).我不工作。得到它。

我是相當新的序言所以原諒我,如果我問的是非常明顯的,但我一直在思考這個在過去的幾個小時,不明白髮生了什麼事。

回答

1

好的,我想我明白了,當我寫[H|T]時,H是一個元素,T是一個列表,所以在012上調用謂詞不等同於調用由append(H,T,L)創建的L謂詞。

+0

是的,你明白了。 '[H | Hs]'與'[H,Hs]'非常不同。混淆兩者是普通初學者的錯誤。舉一個非常簡單的例子,思考'[H | []]'和'[H,[]]'之間的區別。每個列表中有多少個元素?你可以寫多少等價的其他*方法? – mat

相關問題