3

Prolog で書かれたアプリケーションを開発しています。要素のリストをフィルタリングし、特定の制約または条件を満たさない要素を削除し、元のリストの順序を維持したいところまで来ました。それを行うための最良の方法は次のようなものになると思いました:

filter([],Filtered).
filter([L|List],[F|Filtered]) :-
    /* Conditions are met: bypass the element to the filtered list */
    check_conditions(L),
    filter(List,Filtered).
filter([L|List],Filtered) :-
    /* Conditions are not met: do not include the element in the filtered list */
    filter_aborts(List,Filtered).

問題の解決策として受け入れる前に、(独立して) 試してみたかったので、コードをコンパイルして実行し (SWI-Prolog)、いくつかの状況をテストしました。ハードコーディングされたリスト (または任意の名前) を使用して Prolog クエリを入力すると、次のような結果が得られます。

?- filter([id01,id02,id03,id04,id05,id06],F).
F = [id03, id05, id06|_G1024] .

リストは確かにフィルタリングされていますが_G1024、最後にこのインスタンス名 " " が表示されます。F がインスタンス化されていないためにこれが発生することは理解していますが、解決策はわかりません。さらに、インスタンス化された変数としてリストを入力するなど、別のことをしようとすると、さらに奇妙な結果が得られます。

?- L=[id02,id03,id04,id05,id06].
L = [id02, id03, id04, id05, id06].

?- filter(L,F).
L = [] ;
L = [id01],
F = [id01|_G347] ;
L = [id01, id01],
F = [id01, id01|_G403] 
... and so on.

Prolog 変数は一度だけ割り当てられる変数であるはずではありませんか? 私のプログラムは実際に変更されていますか、Lそれとも正しく理解していませんか? それとは別に、私は Prolog を初めて使用するので、私の Prolog についてのコメントをいただければ幸いです。

4

2 に答える 2

8

SWI-Prolog を使用しているので、条件に応じて成功または失敗する述語を記述して、include(Predidate, Lst, Success)を使用できます。例として

include(check_conditions,Lst, Success)
于 2013-02-11T14:15:22.940 に答える
4

あなたの基本再帰は書かれるべきです

filter([],[]).

タイプミスがあります

filter([L|List],[L|Filtered]) :-
...

(2番目の)Lの代わりに、シングルトンFがありました

于 2013-02-11T14:15:13.137 に答える