如何找到所有国家的运营商数量的列表中的一个数等于

问题描述 投票:0回答:1

我们拥有数量和运营商的列表中,我们必须找到平等的状态女巫通过定义操作元素的列表

例如:

输入:

Numbers: 1,2,3
Operators: +,-,/,*,(,)

输出:

1-> +2+3 (not valid)
1-> +2-3 (not valid)
1-> -2+3 (valid)
.
.
2-> +3-1 (valid)
2-> +3+1 (not valid)
.
.
3-> +1+2 (valid)
3-> +1-2 (not valid)

并且只显示有效状态...

此代码仅显示所有状态。我如何开发他们实现这一目标?

member_(In, X) :-
  member(X, In).

get_calcul([N], _, Temp, Out) :-
   append(Temp, [N], Out).

get_calcul([N|T], [Op|Top], Temp, Out) :-
   append(Temp, [N, Op], Temp1),
   get_calcul(T, Top, Temp1, Out).

all_operations(In, Out) :-
   % if you have N numbers
   length(In, Len),
   % you need N-1 operators
   LenOps is Len - 1,
   length(LOps, LenOps),
   setof(Op, LOps^Ops^
               (  maplist(member_([+,-]), LOps),
                  get_calcul(In, LOps, [], Ops),
                  atomic_list_concat(Ops, Op)
               ), Out).

查询:

all_operations([1,2,3], Out), maplist(writeln, Out).
prolog
1个回答
1
投票

不是有很多事情改变:

member_(In, X) :-
    member(X, In).

get_calcul([], [], Out, Out).

get_calcul([N|T], [Op|Top], Temp, Out) :-
    append(Temp, [Op, N], Temp1),
   get_calcul(T, Top, Temp1, Out).

all_operations(In, Out) :-
    length(In, Len),
    LenOps is Len - 1,
    length(LOps, LenOps),
    length(Input, LenOps),
    setof([V,Op], LOps^Ops^Input^(maplist(member_([+,-,/,*]), LOps),
                              maplist(member_(In), Input),
                              get_calcul(Input, LOps, [], Ops),
                              atomic_list_concat(Ops, Op),
                              compute(Op, V),
                              member(V, In)), Out).

compute(Atom, V) :-
    catch((term_to_atom(Term, Atom), V is Term), V, fail).

我们得到:

?- all_operations([1,2,3], Out), maplist(writeln, Out).
[1,+1*1]
[1,+1/1]
[1,+2-1]
[1,+2/2]
[1,+3-2]
[1,+3/3]
[1,-1+2]
[1,-2+3]
[2,+1*2]
[2,+1+1]
[2,+2*1]
[2,+2/1]
[2,+3-1]
[2,-1+3]
[3,+1*3]
[3,+1+2]
[3,+2+1]
[3,+3*1]
[3,+3/1]
Out = [[1, '+1*1'], [1, '+1/1'], [1, '+2-1'], [1, '+2/2'], [1, '+3-2'], [1, '+3/3'], [1, '-1+2'], [1|...], [...|...]|...].
© www.soinside.com 2019 - 2024. All rights reserved.