免責事項:これは、私自身の時間に行う非公式で評価されていないコースワークです。私はそれを自分で試しましたが、失敗し、現在いくつかのガイダンスを探しています。
リストのメンバーを1回だけ返すバージョンのmember/2関数を実装しようとしています。
例えば:
| ?- member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
X = 1 ? ;
各番号を最大1回だけ印刷してほしい。
| ?- once_member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
no
カット「!」でこれを行うように言われました。オペレーターですが、私は自分のコースのメモを調べてカットやオンラインを増やしましたが、それでも頭の中でクリックすることはできません!
これまでのところ、私はなんとか取得できました:
once_member(E, [E | L]) :- !.
once_member(E, [_, L]) :-
once_member(E, L).
これは1を返し、それ以外は何も返しません。カットが間違った場所にあり、可能な試合ごとにバックトラックを妨げているように感じますが、次にどこに行くのか本当にわかりません。
コースノートと、http://www.cs.ubbcluj.ro/~csatol/log_funk/prolog/slides/5-cuts.pdfおよびProgramming in Prolog(Googleブックス)も確認しました。
カットを論理的に適用する方法についてのガイダンスが最も役立ちますが、答えは私がそれを自分で理解するのに役立つかもしれません。
また、失敗による'\ +'否定を使用する別の方法を実行するように言われましたが、カットが私のために小刻みに動いたら、これはもっと簡単かもしれませんか?