3

ListがTListでTimes回繰り返される場合に true である述語 rep( ?List , ?Times , ?TList ) が必要だとします(たとえば、)。2 つの引数がインスタンス化されている限り、これは機能するはずです。ここで、やや機能するバージョン:rep([a,c],2,[a,c,a,c])

rep(_,0,[]).
rep(List,1,List).
rep(List,Times,TList) :- integer(Times), Times>1,
    succ(RemTimes,Times), append(List,RemList,TList),
    rep(List,RemTimes,RemList).
rep(List,Times,TList) :- var(Times),
    append(List,RemList,TList),
    rep(List,RemTimes,RemList), !,
    succ(RemTimes,Times).

2 つの質問:

  1. それを行う組み込みの(私が見つけることができない)ものはありませんか?
  2. これを行うより簡単な方法はありますか?最後の句を取り除くのが好きですか?Timesがインスタンス化されていない場合のTimesRemTimesの関係を表現する方法が見つからなかったため、必要です。
4

4 に答える 4

1

あなたはSWI-Prologを使用しているので、それを行うことができます:

:- use_module(library(lambda)).

rep(Lst, N, R) :-
    (   numlist(1,N, NL)
    ->  foldl(\_X^Y^Z^append(Y, Lst, Z), NL, [], R)
    ;   R = []).

CapelliC の発言を解決するには、Rep (X,2,[a,b,a,b]) の X バインディングを報告しません

foldl(Lst +\_X^Y^Z^append(Y, Lst, Z), NL, [], R)

[編集] ありがとう @false ! 興味深いのは

rep(Lst, N, R) :-
    (   nonvar(N)
    ->  length(NL, N),
        foldl(Lst +\_^Y^append(Y, Lst), NL, [], R)
    ;   foldl(Lst +\_^Y^append(Y, Lst), NL, [], R),
        length(NL, N)),
    !.

しかし残念ながら、これは rep([a,b], N, [a,c,a,c]) でループします!

于 2013-01-30T09:43:19.617 に答える
0

単純な(しかしおそらく非効率的な)戦略は、2番目のリストをスキャンし、最初のリストが残りの部分のサブリストであるかどうかを毎回確認することです。

prefix/2チェックを行うには、 SWI-Prologの演算子を使用できます。

sublist_count(L, R, Times) :-
    sublist_count(L, R, 0, Times).
sublist_count(L, [], Times, Times).
sublist_count(L, [R | Tail], Times, End) :-
    prefix(L, [R | Tail]), !,
    NewTimes is Times + 1,
    sublist_count(L, Tail, NewTimes, End).
sublist_count(L, [R | Tail], Times, End) :-
    sublist_count(L, Tail, Times, End).
于 2013-01-30T09:40:23.757 に答える
0

以下は理にかなっていますか。Times(が未定義の場合は扱っていません。)

rep(List, Times, TList) :-
    length(List, ListLen),
    PrefixLen is ListLen * Times,
    open_list(List, OpenList, OpenList),
    length(TList, PrefixLen),
    append(TList, _, OpenList).

は次のようにopen_list/3定義されます。

open_list([], X, X).
open_list([H | T1], [H | T2], X) :-
    open_list(T1, T2, X).

アイデアは、無限リストを作成してから、必要なプレフィックスを切り取ることです。

使用例:

?- rep([a, c], 2, TList).
TList = [a, c, a, c].

?- rep(List, 2, TList).
List = TList, TList = [] ;
List = [_G886],
TList = [_G886, _G886] ;
List = [_G886, _G889],
TList = [_G886, _G889, _G886, _G889] ;
于 2013-01-31T17:14:33.173 に答える