簡體   English   中英

在不實例化變量本身的情況下,通過 SWI-Prolog 中變量的首次出現來分隔列表

[英]Separate list by first occurence of variable in SWI-Prolog without instantiating the variable itself

我有以下源代碼:

split_list(List, L, [R1|RN], Condition) :-
   find_first(List, R1, Condition),
   append(L, [R1|RN], List), 
   forall(member(X, L),
   not(call(Condition, X))).

find_first([H|_], H, Condition) :- call(Condition, H), !.
find_first([_|T], X, Condition) :- find_first(T, X, Condition).

這個 Prolog 程序將一個列表List分成兩個列表L[R1|RN] R1是滿足謂詞ConditionList的第一個元素。 L包含ListR1之前的所有元素。 L不包含任何滿足Condition的元素。 RN包含ListR1之后的所有元素。

我現在的目標是寫一些謂詞,它將一些列表[a,b,c,D,d,f,e,f,d]分成兩個列表[a, b, c][D, d, f, e, f, d]沒有實例化變量 D。

我剛試過電話:

split_list([a,b,c,_,d,f,e,f,d], L, R, var).

但這會通過 a 或 b 或 c 等實例化 _ 來產生很多解決方案。 我該如何解決?

從它的外觀來看,這是一個更有用的find_first (參數順序更改為更合理):

% P means previous, R means remainder
find_first_succ(Cond, L, P, [H|T]) :-
    find_first_succ_(L, Cond, P, [H|T]).

find_first_succ_([H|T], Cond, [], [H|T]) :-
    call(Cond, H), !.
find_first_succ_([H|T], Cond, [H|P], R) :-
    find_first_succ_(T, Cond, P, R).

swi-prolog 中的結果:

?- find_first_succ(var, [a,b,c,_,d,f,e,f,d], P, R).
P = [a, b, c],
R = [_, d, f, e, f, d].

所以,你不需要那個有問題append

我找到了一些解決方案:

split_list(List, L, [R1|RN], Condition) :- member(R1, List), append(L, [R1|RN], List), call(Condition, R1).

暫無
暫無

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

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