簡體   English   中英

Prolog遞歸從索引中刪除元素,索引是n的倍數,其中n是任意數字

[英]Prolog Recursion removing elements at index that is multiples of n from a list where n is any number

這是我第一次在這里問一個問題,但我有一個問題,我真的無法理解這是Prolog遞歸,特別是當它處理列表時。 所以我應該解決的任務是寫一個像這樣工作的drop謂詞。 例如, drop([1,2,3,4,5,6,7,8,9], 2, L)其中L = [1,3,5,7,9]N=n ,其中元素在位置n,2n,3n ....將被刪除。 列表從1開始是另一件需要注意的事情。

這是我迄今為止的嘗試和思考過程:

drop([], _, []).

indexOf([X|_], X, 1). %Using 1 because the question says the first element starts from 1.

indexOf([_|Ys], Y , I):-
    indexOf(Ys, Y, N),
    I is N + 1.

drop([X|Xs], Y, [X|_]) :-
    indexOf([X|Xs] , X , A),
    Z is A mod Y,
    Z \== 0.

drop([X|Xs], Y, Zs) :-
    %indexOf([X|Xs], X, A),
    drop(Xs, Y, Zs).

我創建了一個indexOf謂詞來查找從1開始的元素的索引。 接下來,我的想法是使用我的第一個drop遞歸情況(在上面的代碼中是第5個案例)來檢查並查看元素的位置在除以Y (第二個輸入)時是否返回零的余數。 如果它沒有返回零的余數,則X保留在列表中並且不會被刪除。 然后,prolog移動到第二個drop遞歸情況,只有當Z=0它才會到達,並且它將從列表中刪除X以返回Z s。 本質上,如果在除以Y (第二個輸入)時沒有返回零的余數,則indexOf返回的索引為n,2n,3n ...的indexOf將被刪除。

目前我還沒有在課程的這一點上學過Cut。 如果有人能指出我正確的方向,我將不勝感激。 我已經在這方面工作了將近一天。

我仍然試圖在這種編程范式中調整邏輯和陳述性思維。 如果您能與我分享,我將不勝感激,您是如何親自掌握邏輯編程的?

首先,看看你的方法,使用indexOf/3有一個缺陷。 也就是說,在您需要知道要移除的內容的索引的給定時間點,在您到達之前,您不知道該項目是什么。 此時,索引為1

這是以下規則的一個問題:

drop([X|Xs], Y, [X|_]) :-
    indexOf([X|Xs], X, A),
    Z is A mod Y,
    Z \== 0.

第一個子查詢: indexOf([X|Xs], X, A)在第一次嘗試時將成功A = 1 ,只是按照定義(當然, X在列表[X|Xs]有索引1成功時,然后下一行Z is A mod Y 1因為如果Y > 01 mod Y總是1因此,在這種情況下, Z \\== 0總是成功。

因此,您得到結果: [X|_]其中X是列表的第一個元素。 所以你得到的第一個解決方案就是drop([1,2,3,4], 2, L). L = [1|_] 你的第三個drop/3謂詞子句只是遞歸到列表中的下一個元素,那么它將以相同的方式接替第二個子句,產生, L = [2|_] ,依此類推......

從頂部開始,這是一種思考像這樣的問題的方法。

輔助謂詞

我知道我想要刪除每個第N個元素,所以有一個計數器是有幫助的,這樣每次到達N我都會忽略該元素。 這是通過輔助謂詞drop/4來完成的,除了原始N之外還有一個重復計數器:

drop(L, N, R) :-
    drop(L, N, 1, R).   % Start counter at 1

基本規則

如果我從空列表中刪除任何元素,我會得到空列表 我放棄的元素並不重要。 這表達為:

drop([], _, _, []).

您已經正確表達了此規則。 以上是4參數版本。

遞歸規則1 - 第N個元素

我有列表[X|Xs]X是第N個元素索引,如果我跳過X ,結果是R ,將我的索引計數器重置為1 ,並從Xs刪除第N個元素

drop([_|Xs], N, N, R) :-   % I don't care what the element is; I drop it
    drop(Xs, N, 1, R).

遞歸規則2 - 除第N個元素之外

我有列表[X|Xs]X是第A個元素(< N ),如果我遞增索引計數器( A ),結果是[X|R] ,並從我的Xs刪除第N個元素更新索引計數器

drop([X|Xs], N, A, [X|R]) :-
    A < N,
    NextA is A + 1,
    drop(Xs, N, NextA, R).

這些都是所需的規則(其中4個)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM