[英]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
是滿足謂詞Condition
的List
的第一個元素。 L
包含List
中R1
之前的所有元素。 L
不包含任何滿足Condition
的元素。 RN
包含List
中R1
之后的所有元素。
我現在的目標是寫一些謂詞,它將一些列表[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.