[英]Prolog A predicate for alignment
對齊是指謂詞包含兩個列表,其中三個包含對齊列表。 然后檢查對齊列表中的每個項目的確是其他兩個照明燈中的一個元素。 並且有關於順序的要求,以便排除僅檢查對齊列表中的每個項目是否都是其他兩個輸入燈的成員的可能性。 如果我只是檢查成員,則當反向時有效的對齊方式也將有效。 當然哪個是錯誤的。
Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]
8,2和8,9在這里無效。
當我想到如何實際檢查順序時,我的頭又回到了命令式語言編程的高度。 非常感謝任何輸入。 但不要直接給出答案,我想提示我應該讀些什么。 (我必須這樣說,因為在此站點上我獲得了很好的幫助,以至於如果我不指出這一點的話,它就太騙人了)。
我的想法是,我或prolog需要在其當前元素的索引之后繼續搜索。 那會使反向對齊無效嗎?
編輯:在兩個列表中當前元素的索引之后,都必須繼續搜索。 如上例所示,當找到2時,它開始在索引2和索引5處搜索下一個元素。(第一個元素為1)
一種簡單的檢查對齊方式是使用append/3
,即:
append(_, [El | T1], L1),
append(_, [El | T2], L2),
...
其中L1
和L2
是給定的列表,而El
是它們必須共享的元素。 以后您可以檢查T1
和T2
對齊。
以下是完整的解決方案:
align(L1, L2, [El | T]) :-
append(_, [El | T1], L1),
append(_, [El | T2], L2),
align(T1, T2, T).
align(_L1, _L2, []).
% Test, executed at consult time
:- align([4,2,9,8], [1,9,5,2,3,8], Alignment), writeln(Alignment), fail; true.
測試輸出:
[2, 8]
[2]
[9, 8]
[9]
[8]
[]
關鍵不是算法上的思考過多,而是要研究謂詞為真的情況。
在這里,我將考慮對齊列表(第三個參數)為空且不為空的情況。 對於非空的情況,請描述輸出列表的第一個元素必須保留的內容,並對其余列表使用遞歸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.