2016-04-12 20 views
0

こんにちは私は問題に直面しています。私に3つの操作(+、 - 、*)があるとしましょう。 私はこれらの3つの演算子を使用して、与えられた引数リストのすべての可能な式を含む変数を生成したいと思います。与えられたリストのすべての可能な操作を生成するプロローグ

my_problem([1,2],X)はそうで

X=1+2+3 X=1-2-3 
X=1+2-3 X=1+2*3 
X=1-2+3 ... 

を返すとなり

X=1-2 
X=1*2 
X=1+2 

my_problem([1,2,3],X)を返します。

私はこの述語を使用して式を構築できることを知っています。

args_expr(Arg1,Arg2,Arg1 + Arg2). 
args_expr(Arg1,Arg2,Arg1 - Arg2). 
args_expr(Arg1,Arg2,Arg1 * Arg2). 

この変数を生成するための巧妙な方法はありますか?助けやアドバイスに感謝します。

+0

*すべての可能な式*ちょうど1回与える各値を使用するすべての式を意味しますか?そして、連想性が違いを生む場合、あなたはすべての可能性(例えば、X = 1 + 2 * 3、X = 1 + 2 * 3、X = 1 * 2 + 3)を望んでいますか? 、 'X = 1 *(2 + 3)'など)?あなたが何をしているのかはちょっと不明です。 – lurker

答えて

1

あなたは表現構築するために、いわゆる "大学" 演算子、=..を使用することができます。

?- Expr =.. [+, A, B]. 
Expr = A+B. 

をそして、あなたは操作を列挙することができますがあります。そして、

op(+). op(-). op(*). 

?- op(Op), Expr =.. [Op, A, B]. 
Op = (+), 
Expr = A+B ; 
Op = (-), 
Expr = A-B ; 
Op = (*), 
Expr = A*B. 

またはおそらく:

?- op(Op1), op(Op2), E =.. [Op1, A, E0], E0 =.. [Op2, B, C]. 

ここから、任意の数の要素(2つまたは3つだけではない)のリストに対してこれを行う方法を理解するだけです。

ヒント:あなたはexpr/3を定義する方法を見つけ出す場合は、あなたが行うことができます。もちろん

?- foldl(expr, [B,C], A, E). 
E = C+ (B+A) ; 
E = C- (B+A) ; 
E = C* (B+A) ; 
E = C+ (B-A) ; 
E = C- (B-A) ; 
E = C* (B-A) ; 
E = C+B*A ; 
E = C-B*A ; 
E = C* (B*A). 

foldlの二番目の引数は、任意の長さのリストを指定できます。

関連する問題