5

私は大学の試験のために Prolog を勉強していますが、この演習には問題があります。

要素がリストに属していないnot_member(X,L)場合に TRUEになる述語を実装します。XL

私の推論が正しければ、解決策を見つけました。

% FACT (BASE CASE): It is TRUE that X is not in the list if the list is empty.
not_member(_,[]).

% RULE (GENERAL CASE): If the list is non-empty, I can divide it in its Head
%   element and the sublist Tail. X does not belong to the list if it is different 
%   from the current Head element and if it does not belong to the sublist Tail.
not_member(X,[Head|Tail]) :-
   X =\= Head,
   not_member(X,Tail).

次のクエリが示すように、このコードは数値のリストでうまく機能します。

2 ?- not_member(4, [1,2,3]).
true.

3 ?- not_member(1, [1,2,3]).
false.

ただし、数値以外の要素を含むリストでは機能せず、エラーが報告されます。

4 ?- not_member(a, [a,b,c]).
ERROR: =\=/2: Arithmetic: `a/0' is not a function

なんで?

4

2 に答える 2

7

資料をチェックしよう!

(=\=)/2は算術演算子です。

+Expr1 =\= +Expr2 式 Expr1 が Expr2 と等しくない数値に評価される場合に真になります。

2 つの一般的な用語を比較するには(\=)/2を使用する必要があります。

not_member(_, []) :- !.

not_member(X, [Head|Tail]) :-
     X \= Head,
    not_member(X, Tail).

と:

?- not_member(d, [a,b,c]).
true.
于 2013-04-07T17:15:11.640 に答える
5

を使用して、根拠のある場合と根拠のない場合の両方で、論理的に正しい答えを取得してください!

この回答のように、 として定義non_member(E,Xs)maplist(dif(E),Xs)ます。

maplist(dif(E),Xs)and not_member(E,Xs) by @Haileをテストしてみましょう!

?- not_member (E,[1,2,3])。
。%間違っています!E=4 は?

?- maplist(dif(E),[1,2,3])。
dif(E,1)、dif(E,2)、dif(E,3)。保留中の目標の成功率

不動ですか?(この重要な問題の詳細については 、これこれこれ、およびこの回答を参照してください。)

?- E=d, not_member (E,[a,b,c])。
E = d。
?-       not_member (E,[a,b,c]), E=d.
。%不動

?- E=d, maplist(dif(E),[a,b,c])。
E = d。
?- maplist(dif(E),[a,b,c]), E=d. % 不動
E = d。

最も一般的な使用法を忘れないでください。

?- not_member (E、X)。               
Xs = []。%多くソリューションが不足しています!

?- maplist(dif(E),Xs)。
  Xs = []
; Xs = [_A] , dif(E,_A)
; Xs = [_A,_B] , dif(E,_A), dif(E,_B)
; Xs = [_A,_B,_C], dif(E,_A), dif(E,_B), dif(E,_C)
...
于 2015-07-09T01:54:58.517 に答える