多个Ifs上的Prolog运算符优先级冲突

多个Ifs上的Prolog运算符优先级冲突,prolog,Prolog,我对prolog有点陌生,不知道这是怎么回事 ecoZona(Z):- zona(Z, L1), (L1 = [] -> write('Zona nao encontrada'), nl,nl ; write('cenas\n'), listaEcos(L1,A,B,C,D), format('Ha ~w de Lixo Organico\n ~w de Papel\n ~w de Metal\n ~w de Vidro', [A, B, C, D]),

我对prolog有点陌生,不知道这是怎么回事

ecoZona(Z):-
zona(Z, L1),
(L1 = [] -> 
    write('Zona nao encontrada'), nl,nl ;
    write('cenas\n'),
    listaEcos(L1,A,B,C,D),
    format('Ha ~w de Lixo Organico\n ~w de Papel\n ~w de Metal\n ~w de Vidro', [A, B, C, D]),
    max([A, B, C, D], X),
    F is div(700,X),
    M is mod(700,X),
    ( M <0 -> F is F+1; F is F+0),
    format('Sao Precisos ~w camioes', [F])).


listaEcos([],A,B,C,D).
listaEcos([L|R],A,B,C,D):-
findall([I,T,_,P], ecoponto(I, T, _, P), L2),
(L2 = [] ->
    write('---------\n');
    somaMais(L2,A,B,C,D)),
listaEcos(R,A,B,C,D).

somaMais([],A,B,C,D).
somaMais([L3|R3],A,B,C,D):-
nth0(1, L3, ElemType),
nth0(3, L3, ElemPerc),
( ElemPerc >= 90 ->
    (ElemType = 'Organico'
        -> soma(A,ElemPerc,F);
            (ElemType = 'Papel'
                -> soma(B,ElemPerc,G);
                    (ElemType = 'Metal'
                        -> soma(C,ElemPerc,H);
                        soma(D,ElemPerc,I),
                    )
            )
    )
somaMais(R3,F,G,H,I)).


soma(A,Elem, H):-
H is A+Elem.    
ecoZona(Z):-
地带(Z,L1),
(L1=[]->
书写('Zona nao encontrada'),nl,nl;
写入('cenas\n'),
listaEcos(L1、A、B、C、D),
格式('Ha~w de Lixo organic o\n~w de Papel\n~w de Metal\n~w de Vidro',[A、B、C、D]),
最大值([A,B,C,D],X),
F是第(700,X)部分,
M是mod(700,X),
(mf是F+1;F是F+0),
格式('Sao Precisos~w camioes',[F])。
listaEcos([],A,B,C,D)。
上市公司([L | R]、A、B、C、D):-
findall([I,T,P],ecoponto(I,T,P),L2),
(L2=[]->
写入('-----------\n');
索马里语(L2,A,B,C,D)),
列表(R、A、B、C、D)。
索马里人([],A,B,C,D)。
索马里人([L3 | R3],A,B,C,D):-
nth0(1,L3,元素类型),
nth0(3,L3,ElemPerc),
(ElemPerc>=90->
(ElemType='organito'
->soma(A,ElemPerc,F);
(ElemType='Papel'
->soma(B,ElemPerc,G);
(ElemType='Metal'
->躯体(C,ElemPerc,H);
索马(D,ElemPerc,I),
)
)
)
索马里人(R3,F,G,H,I))。
躯体(A、Elem、H):-
H是一个+元素。
SWI Prolog告诉我,在与
soma(D,ElemPerc,I)对应的行上有一个
语法错误:运算符优先级冲突
,我缺少什么?所有这些假设都有问题吗

我有一套垃圾桶(有名称、类型、位置和容量)。 这个想法是,给定一个区域(有几个位置),我可以从该区域的垃圾桶中得到超过90个容量的总和


因此ecoZona会抓取这个区域并“发送”给listaEcos,这一个会将垃圾桶列表(及其属性)拆分为单独的垃圾桶。然后somaMais将容量相加(拆分纸张、玻璃、金属和有机物)

D是D1+ElemPerc,
之后有一个错误的逗号。另外,您在这里也会遇到问题,因为您正在使用
is/2
来“分配”值,例如
A1 is A
。如果
A
没有值,这将是一个错误,因为
is/2
是一个表达式计算器,而不是赋值运算符(Prolog没有赋值运算符)。如果
A
已经有一个值,那么
A is A1+ElemPerc
将失败,因为您试图更改
A
,而它已经绑定,这在Prolog谓词子句中是无法执行的。谢谢@lower,我还能得到该和的值吗?我能算出那些总数吗?如果我创建另一个“返回”和值的函数,可以吗?是的,有一种方法,你需要采取完全不同的方法。您正试图像其他语言一样使用Prolog,但它不是这样工作的。您需要更清楚地了解谓词的实际作用。不清楚。可能会显示一个您想要进行的示例查询以及预期的结果。你的新错误是因为你在
之后漏掉了逗号。基本上我有很多回收箱。在函数的这一部分中,我想看看他们的垃圾级别是否超过90
ElemPerc>=90->
,如果是,将该级别添加到一个变量中,这样我就可以看到我需要多少辆车来收集所有垃圾。我有不同种类的容器(纸、金属、有机物和玻璃),所以我需要将这些值分开使用谓词而不是函数。谓词定义关系。请显示一个您希望使用预期结果进行的示例查询。
D是D1+ElemPerc,
之后有一个错误的逗号。另外,您在这里也会遇到问题,因为您正在使用
is/2
来“分配”值,例如
A1 is A
。如果
A
没有值,这将是一个错误,因为
is/2
是一个表达式计算器,而不是赋值运算符(Prolog没有赋值运算符)。如果
A
已经有一个值,那么
A is A1+ElemPerc
将失败,因为您试图更改
A
,而它已经绑定,这在Prolog谓词子句中是无法执行的。谢谢@lower,我还能得到该和的值吗?我能算出那些总数吗?如果我创建另一个“返回”和值的函数,可以吗?是的,有一种方法,你需要采取完全不同的方法。您正试图像其他语言一样使用Prolog,但它不是这样工作的。您需要更清楚地了解谓词的实际作用。不清楚。可能会显示一个您想要进行的示例查询以及预期的结果。你的新错误是因为你在
之后漏掉了逗号。基本上我有很多回收箱。在函数的这一部分中,我想看看他们的垃圾级别是否超过90
ElemPerc>=90->
,如果是,将该级别添加到一个变量中,这样我就可以看到我需要多少辆车来收集所有垃圾。我有不同种类的容器(纸、金属、有机物和玻璃),所以我需要将这些值分开使用谓词而不是函数。谓词定义关系。请显示一个您希望使用预期结果进行的查询示例。