0

私は SWI-Prolog を使用しており、私が書いたいくつかの述語を実行しようとすると、答えの最後に自動的にピリオドが置かれ、次の行にまっすぐ進みます。Enterキーを押すか、自分でフルストップを置く必要がある人もいます。どうしてこれなの?

% range(1,5,X) -> X = [1,2,3,4,5]

range(X, X, [X]).
range(Low, High, [Low | Xs]) :-
    Low =< High,
    Low1 is Low+1,
    range(Low1, High, Xs).

これは、Enter キーを押すか「.」を「手動で」押す必要がある例です。最後に、';' を押しても false を返します。しかし、なぜ false を返すのかわかりません。

4

1 に答える 1

1

を押す;と、PROLOG に、最後の結果が十分ではなく、最後の決定ジャンクションに戻って別の分岐を取る必要があることを伝えています。;Prologは、決定点がない場合、押すことを許可しません。サンプル関数の場合、2 つのパラメーターが等しい場合に決定が行われ、どちらの場合range(X, X, [X]).range(Low, High, [Low | Xs])...有効な選択肢です。与えられた最初の結果は に対応し、範囲の最後の要素であるrange(X, X, [X]).を返します。[X]元のクエリが であると仮定するとrange(1,2,X)、検索は で終了しrange(2,2,[2]).ます。ただし、押す;と次のようになります。

range(2, 2, [2|Xs]) ....

再帰クエリを実行します

range(3, 2, Xs) ....

これは最終的に失敗しLow =< High 、結果を生成しfalseます。

于 2015-03-16T16:06:46.580 に答える