Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List prolog中列表元素的算术运算_List_Recursion_Prolog_Expression - Fatal编程技术网

List prolog中列表元素的算术运算

List prolog中列表元素的算术运算,list,recursion,prolog,expression,List,Recursion,Prolog,Expression,我在Prolog中得到了这个任务,我不知道如何处理它 我必须编写谓词表达式(列表、结果、结果),它使用List中的每个元素构建一个算术表达式。它给出了一个结果,在回溯之前,该结果必须等于结果 例如: ?- expression([1, 2, 3, 4], 2, X). X = 1+ (2+ (3-4)) 或 我试过这样的方法: operation(A, B, A + B). operation(A, B, A - B). operation(A, B, A * B). operation(A,

我在Prolog中得到了这个任务,我不知道如何处理它

我必须编写谓词
表达式(列表、结果、结果)
,它使用
List
中的每个元素构建一个算术表达式。它给出了一个
结果
,在回溯之前,该结果必须等于
结果

例如:

?- expression([1, 2, 3, 4], 2, X).
X = 1+ (2+ (3-4))

我试过这样的方法:

operation(A, B, A + B).
operation(A, B, A - B).
operation(A, B, A * B).
operation(A, B, A div B).

expression([],_,_).
expression([A,B,D|List],Outcome,Result) :-
    operation(A,B,C),
    operation(C,D,Result),
    Outcome is Result.

这适用于三个元素的列表,但我想对不同大小的列表使用它。我想我必须使用递归,但是如何使用呢?如何添加使用括号的可能性?

每个表达式都是一棵树。它的叶子的边缘总是相同的列表-给定的第一个参数。它的结构反映了括号。然后,对于每棵树,当“从上面看”时,其节点形成一个算术二进制运算符列表。对于每个树,需要考虑这些运算符的所有组合。
表达式(列表、结果、Xpr):-
树(列表,T,节点),列表中有%N个ELT,节点中有N-1个
组合(节点、[+、-、*、/])、%或任何您想要使用的操作
评估(T,结果),
括号内(T,Xpr)。
组合(节点、操作):-%使用_模块(库(lambda))。
映射列表(\X^(成员(X,Ops)),节点)。

剩下的就是实现剩下的东西。

每个表达式都是一棵树。它的叶子的边缘总是相同的列表-给定的第一个参数。它的结构反映了括号。然后,对于每棵树,当“从上面看”时,其节点形成一个算术二进制运算符列表。对于每个树,需要考虑这些运算符的所有组合。
表达式(列表、结果、Xpr):-
树(列表,T,节点),列表中有%N个ELT,节点中有N-1个
组合(节点、[+、-、*、/])、%或任何您想要使用的操作
评估(T,结果),
括号内(T,Xpr)。
组合(节点、操作):-%使用_模块(库(lambda))。
映射列表(\X^(成员(X,Ops)),节点)。
剩下的就是实现剩下的东西

operation(A, B, A + B).
operation(A, B, A - B).
operation(A, B, A * B).
operation(A, B, A div B).

expression([],_,_).
expression([A,B,D|List],Outcome,Result) :-
    operation(A,B,C),
    operation(C,D,Result),
    Outcome is Result.