簡體   English   中英

Prolog:過濾目標列表並保留成功的目標

[英]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.

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