2016-04-12 10 views
0

Hallo Ich stehe vor einem Problem. Nehmen wir an, ich habe 3 Operationen (+, -, *). Ich möchte eine Variable generieren, die alle möglichen Ausdrücke für eine gegebene Liste von Argumenten enthält, die diese 3 Operatoren verwenden.Prolog Generieren aller möglichen Operation für eine gegebene Liste

my_problem([1,2],X) zurückkehren würde

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

my_problem([1,2,3],X)

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

und so weiter zurückkommen würde.

Ich weiß, dass ich Ausdruck mit diesen Prädikaten erstellen kann.

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

Gibt es eine clevere Möglichkeit, diese Variable zu generieren? Ich wäre dankbar für jede Hilfe oder Beratung.

+0

Mit * alle möglichen Ausdrücke * meinst du nur alle Ausdrücke, die jeden Wert verwenden, den du genau einmal gibst? Und in Fällen, in denen Assoziativität einen Unterschied macht, wollen Sie alle Möglichkeiten (zB, X = 1 + 2 * 3 ', 'X = (1 + 2) * 3',' X = 1 * 2 + 3 ') , 'X = 1 * (2 + 3)', usw.)? Es ist ein wenig unklar, was genau Sie suchen. – lurker

Antwort

1

können Sie verwenden, um den so genannten "univ" Operator, =.., Ausdrücke zu bauen:

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

Und Sie die Vorgänge aufzählen können Sie haben:

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

Dann:

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

Oder vielleicht:

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

Von hier aus, was Sie brauchen, ist nur herauszufinden, wie dies für Listen einer beliebigen Anzahl von Elementen (nicht nur zwei oder drei) zu tun.

Hinweis: Wenn Sie herausfinden, wie expr/3 zu definieren, können Sie tun:

?- 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). 

Natürlich kann das zweite Argument zu foldl eine Liste von beliebiger Länge sein.

Verwandte Themen