permutation/2
および述語を使用すると、次のprefix/2
ように記述できます。
has_prefix_perm(List1, List2) :-
permutation(List2, Permutation),
prefix(Permutation, List1),
!.
補足として、 swi-prolog マニュアルを引用するには:
長さ N のリストには N があることに注意してください! 順列と無制限の順列生成は、かなり短いリスト (10! = 3,628,800) であっても、法外に高価になります。
したがってhas_prefix_perm/2
、すべてのケースがテストされるため、特にプレフィックスモジュロ順列ではない場合は、長すぎる2番目のリストで呼び出さないように注意します。
もう 1 つの方法は、List2 が空になるまで List1 の項目が List2 のメンバーであるかどうかをテストすることです。これにより、順列が存在することがわかります。
has_prefix_perm(_, []) :- !.
has_prefix_perm([Head1|List1], List2) :-
once(select(Head1, List2, Rest)),
has_prefix_perm(List1, Rest).
そのように書かれているので、非根拠リストでは使用しませんが、あなたのOPを見て、それ以上検索しませんでした...
もう 1 つの方法は、 List1 が List2 の長さに短縮されているかどうかを確認することです。これは List2 の順列です。
has_prefix_perm(List1, List2) :-
length(List2, L),
length(LittleL1, L),
append(LittleL1, _, List1),
permutation(LittleL1, List2),
!.
別の方法は...それを行う方法はたくさんあると思いますが、それほど複雑ではなく、あなたのスタイルに合った方法を選んでください! :)
個人的には最後の方に行きたいです。