2

私はこれを行うプログラムを書くつもりです:

?- pLeap(2,5,X,Y).
X = 2,
Y = 3 ;
X = 3,
Y = 4 ;
X = 4,
Y = 5 ;
X = 5,
Y = 5 ;
false.

(2 から 5 までのすべてのペア X,X+1 に加えて、最後の特殊なケースを示します)。

これがおそらく解決策です。仕組みがよくわからないのですが、どなたか教えていただけないでしょうか?

pLeap(X,X,X,X).
pLeap(L,H,X,Y) :-
        L<H,
        X is L,
        Y is X+1.
pLeap(L,H,X,Y) :-
        L=<H,
        L1 is L+1,
        pLeap(L1,H,X,Y).

私は次のように簡単にします:

pLeap(L,H,X,Y) :-
        X >= L,
        X =< H,
        Y is X+1.

なぜ機能しないのですか (最後の特別なケースを無視します)?

4

2 に答える 2

4

あなたはあなたの問題のためにライブラリclpfdを使うことができます。

:- use_module(library(clpfd)).

pLeap(L,H,X,Y) :-
    X in L..H,
    Y #= min(H, X+1),
    label([X]).

出力は次のとおりです。

 ?- pLeap(2,5,X,Y).
X = 2,
Y = 3 ;
X = 3,
Y = 4 ;
X = 4,
Y = 5 ;
X = 5,
Y = 5.
于 2010-04-28T15:39:39.737 に答える
2

>=and演算子は=<引数をインスタンス化せず、引数が既にインスタンス化されている場合にのみ使用できます。

別の言い方をすれば、与えられた解では、Xとは でY値が与えられis<=<演算子は と でのみ使用されLHその値はユーザーによって与えられます。(与えられた解決策を試しpLeap(L,H,2,3)てみると、あなたが抱えているのと同じ問題が発生します。)

ただし、あなたの場合、まだ値がない>=and =<onを使用しようとすると、インタープリターが文句を言います。X

于 2010-04-27T18:53:54.413 に答える