0

私は学生で、amzi prolog に問題があります。クラスで、項目がリストのメンバーである場合に true を返す述語があることを学びました。

member(1,[1,2,3])true を返す必要があります。

それでも、私は間違っています。

私は何か間違ったことをしていますか?

助けてください。

よろしく、ID

4

2 に答える 2

2

アムジ!Prolog には (半) 決定論的な (バックトラックしない)組み込みの述語があり、 list.proライブラリを介してロードする必要がある標準があります。is_member/2member/2

定義は 2 行なので、通常はmember/2必要に応じてプロジェクトのソースに の定義を入れます。

于 2014-07-20T04:07:19.540 に答える
0

アムジ!Prolog の組み込み predicateは、そのドキュメントis_member/2に従って決定論的であり、単純にメンバーシップをテストします。バックトラックでリストのすべてのメンバーが返されるわけではありません。

is_member/2[ sic member/2] は、Term が List のメンバーであるかどうかをすばやくテストするために使用できます。==要素をテストするために、強力な unify ( ) を使用します。リストのさまざまなメンバーをバックトラックするために使用することはできません。定義は次と同等です。

is_member(X, [Y|_]) :- X == Y, !.
is_member(X,[_|Z]) :- is_member(X,Z).

@hardmath が別の回答で指摘したように、クラシックmember/2は Amzi の一部です! Prolog のリスト ライブラリ。member/2ただし、Prolog は [ほとんど] Prolog で記述されているため、リスト ライブラリをインポートする必要があり、簡単に作成できます。

member( X , [X|_]  ) .
member( X , [_|Xs] ) :- member(X,Xs) .
于 2014-07-22T17:28:38.167 に答える