[英]Prolog: Filtering a list of goals and keeping the successful goals
給出以下事實和限制:
car(red, 2000).
car(black, 1990).
car(blue, 2010).
millennials(car(_,Y)) :- (car(_,Y)), Y =< 1995.
red(car(C,_)) :- car(C,_), C == red.
給定一個列表[millennials, red]
,我想打個電話,例如:
checkRestriction([millennials, red], car(red, 2000) , L).
L = red
它返回作為參數傳遞的汽車遵守的條件列表。
這與此線程不同: How to filter a list in Prolog with multiple conditions? ,因為並非所有限制都必須成功,所以目標只是返回一個成功限制列表,並將汽車作為參數傳遞。
我嘗試了以下方法:
checkRestriction([],_,[]).
checkRestriction([H|T], Car, List) :-
( H(Car)
-> append(L, H(Car), List),
checkRestriction(T, Car, List)
; checkRestriction(T, Car, List) ).
哪個檢查是限制以 car 作為參數返回 true,在這種情況下 append 將限制本身列出,否則只是用列表的尾部調用謂詞,但我得到編譯錯誤。
目標H(Car)
導致編譯錯誤,因為變量不能用作 Prolog 中的謂詞名稱。 要更正您的代碼,您必須按如下方式構建目標術語:
?- H = red, Car = car(red,2000), Goal =.. [H,Car].
H = red,
Car = car(red, 2000),
Goal = red(car(red, 2000)).
?- H = millennials, Car = car(red,2000), Goal =.. [H,Car].
H = millennials,
Car = car(red, 2000),
Goal = millennials(car(red, 2000)).
因此,正確的代碼是:
checkRestriction([], _, []).
checkRestriction([H|T], Car, Result) :-
Goal =.. [H, Car],
( call(Goal)
-> Result = [H|List],
checkRestriction(T, Car, List)
; checkRestriction(T, Car, Result) ).
millennials(car(_,Y)) :- car(_,Y), Y =< 1995.
red(car(C,_)) :- car(C, _), C == red.
blue(car(C,_)) :- car(C, _), C == blue.
black(car(C,_)) :- car(C, _), C == black.
運行示例:
?- checkRestriction([millennials, red], car(red,2000), L).
L = [red].
?- checkRestriction([millennials, black], car(black,1990), L).
L = [millennials, black].
?- checkRestriction([millennials, blue], car(blue,2010), L).
L = [blue].
?- checkRestriction([millennials, black], car(blue,2010), L).
L = [].
或者,您可以使用call/N
:
checkRestriction([], _, []).
checkRestriction([H|T], Car, Result) :-
( call(H, Car)
-> Result = [H|List],
checkRestriction(T, Car, List)
; checkRestriction(T, Car, Result) ).
請參閱庫中的 include/3 謂詞(應用)。 https://www.swi-prolog.org/pldoc/doc/_SWI_/library/apply.pl?show=src
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.