0

「iloveyou」という入力を文字列として受け取り、出力するプロローグプログラムを作成しようとしています。

"i love you"
"i love yo"
"i love y"
"i love "
"i love"
"i lov"
"i lo"
"i l"
"i "
"i"

私は現在SWI-Prologを使用していますが、私が持っているコードは次のとおりです。

sublist(S, L) :-
  append(_, L2, L),
  append(S, _, L2).

contains(A, B) :-
  atom(A),
  name(A, AA),
  contains(AA, B).

contains(A, B) :-
  sublist(B, A),
  B \= [].

私はコードを実行するために以下を使用します:

?-forall(contains('i love you'、X)、writef( "%s \ n"、[X]))。

以下は、示されているとおりに生成された出力です。

i
i 
i l
i lo
i lov
i love
i love 
i love y
i love yo
i love you

 l
 lo
 lov
 love
 love 
 love y
 love yo
 love you
l
lo
lov
love
love 
love y
love yo
love you
o
ov
ove
ove 
ove y
ove yo
ove you
v
ve
ve 
ve y
ve yo
ve you
e
e 
e y
e yo
e you

 y
 yo
 you
y
yo
you
o
ou
u

私はありとあらゆる助けに感謝します。よろしくお願いします。

4

2 に答える 2

1

私はあなたの要求を完全には理解していません(あなたはどういう意味that accept input "i love you" as a stringですか?)が、あなたはその出力を生成するためのプログラムを本当に必要としません:

?- forall(append(_, [F|S], "I love you"), format('"~s"~n', [[F|S]])).
"I love you"
" love you"
"love you"
"ove you"
"ve you"
"e you"
" you"
"you"
"ou"
"u"
true.

append / 3の2番目の引数は、少なくとも長さが1になるように「パターン化」されています。これは、そうでない場合に発生する最後の空の文字列を回避するためです。

これまでのところ答えを編集してくださいそれは間違っています:私はそれが尻尾を示していることに気づいていませんでした!これはデバッグされた手順ですが、ジェネレーターとしては機能しません。

pheader([X]) :-
    format('~s~n', [[X]]), !.
pheader(L) :-
    format('~s~n', [L]),
    L = [_|Xs],
    pheader(Xs).

収量

?- pheader("i love you").
"i love you"
" love you"
"love you"
"ove you"
"ve you"
"e you"
" you"
"you"
"ou"
"u"
true.

そして、ついにそれを行うための「プログラム」が必要になります!

編集して初期の動作(ヘッダージェネレーター)を取り戻します。ここでは2つの引数の手順です。

pheader([X|Xs], [X|Xs]).
pheader([_|Xs], R) :-
    pheader(Xs, R).

最後に、目的の出力が得られます。

?- forall(pheader("i love you",X),format('"~s"~n', [X])).
"i love you"
" love you"
"love you"
"ove you"
"ve you"
"e you"
" you"
"you"
"ou"
"u"
true.
于 2013-03-13T10:28:12.967 に答える
0

リストの最後の要素を削除するには、次を使用できますappend(WithoutLast, [Last], List)

foo([]) :- !.
foo(S) :- format('"~s"~n', [S]), append(S1, [_Last], S), !, foo(S1).

?- foo("i love you").
"i love you"
"i love yo"
"i love y"
"i love "
"i love"
"i lov"
"i lo"
"i l"
"i "
"i"
true.

決定論的にしたくない場合は、カットを削除できます。

于 2013-03-13T12:50:44.183 に答える