1

PROLOG で最初の簡単なコードを書きました。

is_beginning([], _).
is_beginning([FirstLetterB|RestWordB], [FirstLetterW|RestWordW]) :-
   FirstLetterB == FirstLetterW,
   is_beginning(RestWordB, RestWordW).

is_beginning の最初の引数が 2 番目の引数と等しいかどうかを調べるように設計されています。まあ、私見は質問にかなりうまく答えることができますが、定義された2番目の引数に対して可能なすべての答えを得る可能性があるかどうか疑問に思っています。例えば。為に

is_beginning(Answers, [a,b,c]);

[]、[a]、[a、b]、[a、b、c]を回答の統合として取得したいのですが、[]しか取得できません(最も簡単な回答)。

私が欲しいものを手に入れる可能性はありますか?多分私の定義に何か問題がありますか?私はすでにfindallとforallを使用しようとしましたが、うまくいきません:(

すべての回答に感謝します。

4

2 に答える 2

2

不要な場合は ( == )/2 を使用しています (ドキュメント ページの最後にあるコメントに注意してください)。実際、「単純な」統合 (=)/2 に変更すると、プログラムは期待どおりに動作します。

is_beginning([], _).
is_beginning([FirstLetterB|RestWordB], [FirstLetterW|RestWordW]) :-
    FirstLetterB = FirstLetterW,
    is_beginning(RestWordB, RestWordW).

テスト:

?- is_beginning(Answers, [a,b,c]).
Answers = [] ;
Answers = [a] ;
Answers = [a, b] ;
Answers = [a, b, c] ;
false.
于 2012-12-10T12:21:54.727 に答える
1

通訳者はすぐにすべての解決策を返すわけではありません。戻ったら[]、「;」を押します。検索を続行するように指示するには:

?- is_beginning(X, [a,b,c]).
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, c] ;
false.

コンソールで印刷するだけでなく、Prologリストでこれらすべてのソリューションが必要な場合は、findall/3実際に探しているものです。

?- findall(X, is_beginning(X, [a,b,c]), L).
L = [[], [a], [a, b], [a, b, c]].
于 2012-12-10T11:22:23.630 に答える