【问题标题】:Prolog generating all possible operation for given listProlog为给定列表生成所有可能的操作
【发布时间】:2016-04-12 07:51:08
【问题描述】:

您好,我遇到了一个问题。假设我有 3 个操作(+、-、*)。 我想使用这 3 个运算符生成包含给定参数列表的所有可能表达式的变量。

my_problem([1,2],X) 会返回

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

等等。

我知道我可以使用这个谓词构建表达式。

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

有没有什么聪明的方法来生成这个变量?如有任何帮助或建议,我将不胜感激。

【问题讨论】:

  • 您所说的所有可能的表达式是指所有使用您给出的每个值的表达式都只给出一次吗?在关联性产生影响的情况下,您是否想要所有可能性(例如,X=1+2*3X=(1+2)*3X=1*2+3X=1*(2+3) 等)?有点不清楚你到底在追求什么。

标签: list prolog operators combinations permutation


【解决方案1】:

您可以使用所谓的“univ”运算符=.. 来构建表达式:

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

从这里到您需要的只是弄清楚如何对任意数量的元素列表执行此操作(不仅仅是两个或三个)。

提示:如果你知道如何定义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 的第二个参数可以是任意长度的列表。

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 2020-05-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多