Prolog:如何生成简单的数学表达式?

ali*_*frd 1 prolog

我需要写(不计算)数字列表的所有状态,这意味着:

输入:

Numbers: 1,2,3
Operators: +,-,/,*
Run Code Online (Sandbox Code Playgroud)

输出:

1+2+3
1-2-3
1/2/3
1*2*3
1+2-3
1+2/3
1+2*3
1-2+3
1-2/3
1-2*3
1/2+3
1/2-3
1/2+3
1*2+3
1*2-3
1+2-3
Run Code Online (Sandbox Code Playgroud)

在下降代码中显示 1+2+3

我怎样才能将它们发展到所有州?

list_sum([Item], Item).
list_sum([Item1,Item2 | Tail], Total) :-
   list_sum([Item1+Item2|Tail], Total).
Run Code Online (Sandbox Code Playgroud)

Pau*_*ura 5

Carlo Capelli发布的一个很好的解决方案的变体允许我们说明一个有用的编程习惯,以更好地利用第一个参数索引:

list_combine([N1| Ns], Os, Nt) :-
    list_combine(Ns, N1, Os, Nt).

list_combine([], N, _, [N]).
list_combine([N2| Ns], N1, Os, [N1, O| Nt]) :-
    member(O, Os),
    list_combine(Ns, N2, Os, Nt).
Run Code Online (Sandbox Code Playgroud)

我们的想法是通过将列表头与尾部分开来传递我们想要行走的列表,并将两者作为参数传递,尾部作为第一个参数,如上所示.

在原始解决方案中,Prolog编译器通常不会区分仅包含一个元素的列表和包含一个或多个元素的列表.但它将区分空列表(原子)和具有至少一个元素(复合词)的列表.还要注意list_combine/3,除了member/2谓词调用上的预期选择点之外,原始版本还为每个递归调用创建了一个虚假的选择点.