5

a整数/浮動小数点数として定義する方法は?

a+b+c+d=10wherea,b,c,dがintegerと。の結果を見つけたいです>=0

4

3 に答える 3

5

SWI-Prolog では CLP(FD) ライブラリを使用できます

1 ?- use_module(library(clpfd)).
%  library(error) compiled into error 0.00 sec, 9,764 bytes
% library(clpfd) compiled into clpfd 0.05 sec, 227,496 bytes
true.

2 ?- Vars=[A,B,C,D],Vars ins 0..10,sum(Vars,#=,10),label(Vars).
Vars = [0, 0, 0, 10],
A = 0,
B = 0,
C = 0,
D = 10 ;
Vars = [0, 0, 1, 9],
A = 0,
B = 0,
C = 1,
D = 9 ;
Vars = [0, 0, 2, 8],
A = 0,
B = 0,
C = 2,
D = 8 ;
Vars = [0, 0, 3, 7],
A = 0,
B = 0,
C = 3,
D = 7 ;
...
于 2009-12-24T12:02:50.910 に答える
5

これは、シンプルで最新の、純粋な Prolog、非 CLP ライブラリ ソリューションです。

range(X):-
        member(X,[0,1,2,3,4,5,6,7,8,9,10]).

ten(A,B,C,D):-
        range(A),
        range(B),
        range(C),
        range(D),
        10 =:= A + B + C + D.
于 2009-12-25T12:48:27.197 に答える
2

以下は、有限領域で制約を解決するGNU-Prologのコードです。

$ gprolog
| ?- [user].
compiling user for byte code...
ten(A,B,C,D) :- fd_domain([A,B,C,D],0,9999999), 10 #= A + B + C + D.

Ctrl+D

| ?- ten(A,B,C,D), fd_labeling([A,B,C,D]).

ご覧のとおり、0-9999999 のような大きな範囲の問題を解決します。

A = 0
B = 0
C = 0
D = 10 ? ;

A = 0
B = 0
C = 1
D = 9 ? ;

A = 0
B = 0
C = 2
D = 8 ? ;
...

PS Przemysław Kobylański のブログで、明確で非常に優れた Prolog の例を紹介してくれてありがとう。

PPS 有限領域で遊ぶときは、 fd_set_vector_max/1を使いたいかもしれません。上記の場合は必要ありませんが、制約によっては役立つ場合があります。Gnu-Prolog が範囲で動作する場合、可能な値のベクトルで動作する場合の詳細については、マニュアルの「有限領域ソルバーと組み込み述語 - 概要」を参照してください。

于 2011-08-27T08:33:48.903 に答える