我的目標是創建一個謂詞,用於檢查給定列表是否包含佔用其他列表中某些位置的元素。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其輸出Yes
上row([1,2|3],[1,2,3,4,5,6,7,8,9],1).
我不工作。得到它。
我是相當新的序言所以原諒我,如果我問的是非常明顯的,但我一直在思考這個在過去的幾個小時,不明白髮生了什麼事。
是的,你明白了。 '[H | Hs]'與'[H,Hs]'非常不同。混淆兩者是普通初學者的錯誤。舉一個非常簡單的例子,思考'[H | []]'和'[H,[]]'之間的區別。每個列表中有多少個元素?你可以寫多少等價的其他*方法? – mat