簡體   English   中英

Prolog 成員謂詞

[英]Prolog membership predicate

我需要編寫一個 Prolog 謂詞,以避免在手頭的列表中多次出現項目的冗余答案,如以下示例查詢所示:

?- member(a, [a, b, a]).
true
?- member(X, [a, b, a]).
X = a ;
X = b ;
false.
?- member(X, [a, b, a, c, a, d, b]).
X = a ;
X = b ;
X = c ;
X = d ;
false.

我知道以下內容將 output 所有這些都不管重復:

member(X, [X|_]).
member(X, [_|T]) :- member(X, T).

比較這兩個條款,是否存在兩者都適用的情況?

member(X, [X|_T]).
member(X, [_Y| T]) :- member(X, T).

只需將兩個子句的標題相互比較即可。 或者,讓 Prolog 為您完成:

?- member(X, [X|_T]) = member(X, [_Y| T]).
   X = _Y, _T = T.

所以_YX必須相同。 它們什么時候相同? 總是,如果第一個子句為真,所以我們需要通過在第二個子句中添加一個進一步的條件來排除這種情況。 它們必須不同。

memberd(X, [X|_T]).
memberd(X, [Y| T]) :- dif(X,Y), memberd(X, T).
?- member(X, [a, b, a, c, a, d, b]).
   X = a
;  X = b
;  X = a
;  X = c
;  X = a
;  X = d
;  X = b
;  false.
?- memberd(X, [a, b, a, c, a, d, b]).
   X = a
;  X = b
;  X = c
;  X = d
;  false.
?- memberd(a, [a, b, a, c, a, d, b]).
   true
;  false.

最后一個查詢可以使用我在 Scryer 中使用的library(reif)來改進,但它也可用於SICStus | 瑞士法郎

:- use_module(library(reif)).
memberd(E, [X|Xs]) :-
   if_(E = X, true, memberd(E, Xs) ).

?- memberd(a, [a, b, a, c, a, d, b]).
   true.

暫無
暫無

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

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