3

引数として指定された特定の長さを持ち、パラメーターとして渡される特定の要素を含む要素として、特定のプロパティを持つ特定のリストのすべてのサブリストを生成したいと思います。私はこれをなんとか実行できましたが、2つの述語の助けを借りて、最適性の点で非常に遅いです:

sublist([], []).
sublist([A|T], [A|L]):-
    sublist(T, L).
sublist(T, [_|L]):-
    sublist(T, L).

choose(T, L):-
    sublist(T, L),
    (dimension(2, T); dimension(1, T)),
    belongs(f, T).

Tここでは、述語のパラメーターを介しchooseて、次元2または1を持ち、要素を含むLリストのすべてのサブリストに戻りたいと思いfます。
述語dimensionとは、それぞれmember事前定義された述語と同じ使用法です。プログラムがそれらの特定のサブリストのみを作成するように、この2つの条件を述語に組み込む方法を教えてください。lengthmember

sublist

4

1 に答える 1

2

以下は、長さのサブシーケンスを構築しますMinLen =< Len =< MaxLen。なぜとの名前を変更lengthしたのかわからないmemberので、オリジナルを使用します。sublist/4あなたのを呼び出しますsublist/2

sublist(Sub,List,MinLen,MaxLen) :-
    between(MinLen,MaxLen,Len),
    length(Sub,Len),
    sublist(Sub,List).

lengthこれは2つの変数で呼び出されるため、反復深化深さ検索が得られることに注意してください。choose/2これで、次のように定義できます

choose(Sub,List) :-
    sublist(Sub,List,1,2),
    member(f,Sub).

これはクリーンなソリューションです。十分に速くない場合は、すべての条件を1つの述語にまとめます。

choose(Sub,List),
    (Sub = [f] ; Sub = [f,_] ; Sub = [_,f]),
    sublist(Sub,List).
于 2010-11-04T09:44:39.057 に答える