簡體   English   中英

Prolog - 從子列表中刪除元素

[英]Prolog - removing elements from sublists

問題陳述:您將獲得一個包含整數和整數列表的列表。 您必須從每個子列表中刪除第1個,第2個,第4個,第8個...等元素。

我的解決方案

domains
        list=integer*
        elem=i(integer);l(list)
        clist=elem*

predicates
        modify(list, list, integer, integer)
        exec(clist, clist)
clauses
        modify([], [], _, _).
        modify([H|T], Mod, I, P):-
                P=I,
                !,
                I1=I+1,
                P1=P*2,
                modify(T, Mod, I1, P1).
        modify([H,T], [H|Mod], I, P):-
                I1=I+1,
                modify(T, Mod, I1, P).

        exec([], []).
        exec([i(N)|T], [i(N)|LR]):-
                exec(T, LR).
        exec([l(L)|T], [l(Mod)|LR]):-
                modify(L, Mod, 1, 1).

        do():-
                exec([i(1),l([1,2,3,4,5,6,7,8,9]),l([1,2,3,4])],X),
                write(X).

問題是該算法有效,直到它從每個子列表中刪除第一個和第二個元素,但從那時起不會刪除一個東西,我不知道我做錯了什么。

exec predicate用於斷言當前元素是整數還是整數列表,將整數添加到結果中,或將修改后的列表添加到結果中。

modify predicate修改給定列表,並應刪除位置功率為2的所有元素。

我寫do predicate只是為了將其作為一個目標,以避免每次我想測試它時寫入列表。

我認為你經常做P1=P*2 ,然后你不匹配2的連續冪

另外,你這里有一個錯字

modify([H,T], [H|Mod], I, P):- ...

應該讀

modify([H|T], [H|Mod], I, P):- ...

我會寫的

modify([], [], _).
modify([_|T], Mod, I):-
    is_pow2(I), !, % as noted by SQB
    I1 is I+1,
    modify(T, Mod, I1).
modify([H|T], [H|Mod], I):-
    I1 is I+1,
    modify(T, Mod, I1).

為了保持is_pow2 / 1簡單,你可以做到

is_pow2(1).
is_pow2(2).
is_pow2(4).
is_pow2(8).
is_pow2(16).
...

或使用您的Prolog算術設施。 在SWI-Prolog中,一個簡單的定義可能是

is_pow2(N) :- 
    between(0, 63, L),
    N is 1 << L.

實際上,修改的核心是正確的,因此它可能是exec中的問題。 以下適用於我:

do_modify(X) :-
  modify([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18], X, 2).

modify(Lin, Lout, Base) :- modify(Lin, Lout, Base, 1, 1).

modify([], [], _, _, _).
modify([_|T], X, Base, N, Power) :-
  N = Power,
  !,
  P1 is Power * Base,
  N1 is N + 1,
  modify(T, X, Base, N1, P1).
modify([H|T], [H|X], Base, N, Power) :-
  N1 is N + 1,
  modify(T, X, Base, N1, Power).

http://www.compileonline.com/execute_prolog_online.php上測試過。

暫無
暫無

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

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