Как найти все состояния операторов равных одному числу в списке чисел - PullRequest
0 голосов
/ 03 февраля 2019

У нас есть список номеров и список операторов, которые мы должны найти с помощью равных для управления элементом состояний, определив

, например:

input:

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

1 Ответ

0 голосов
/ 03 февраля 2019

Не так много вещей, которые можно изменить:

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|...], [...|...]|...].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...