序言,否则逻辑(错误:操作员优先级冲突)

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

我是新手,因此请练习练习。目前,我对第5行的错误感到困惑,该错误说语法错误:操作员优先级冲突。这可能是由于逻辑的嵌套,但是我想知道是否有一种方法可以使这种嵌套起作用。

loopOver3(elt1, elt3, [H|T], sum):-
    ( =(elt1, elt2) =:= true ->  
      sum is sum + (elt1 + elt2),
      ;   =(elt1, elt2) =\= false -> ( =(elt1, H) =:= true ->  
            sum is sum + (elt1 * H),
            ;  =(elt1, H) =\= false -> ( =(elt2, H) =:= true ->  
                    ( \=(H, 0) =:= true ->
                      sum is sum + (100 / H)
                    )
                )
          )
    )
    loopOver3(elt1, elt3, T, sum).

我想要做的Sudo代码:

for elt3 in list3: 
    if elt1 == elt2: 
        sum = sum + (elt1 + elt2) 
    else: 
        if elt1 == elt3: 
            sum = sum + (elt1 * elt3) 
        else: 
            if (elt2 == elt3) and (elt3 != 0): 
                sum = sum + (100 / elt3)
prolog swi-prolog
1个回答
0
投票

您需要花点时间去理解Prolog中的概念。您最初的尝试充满了原子(小写)而不是变量(大写)。它具有可变性。您在想像Prolog具有返回值的函数(具有谓词)(它们不-它们要么成功要么失败)。

我已经假设您要从列表中剥离前三个值,然后删除第一项并向下递归。

所以,如果我有此列表[1,2,1,2],我首先要查看[1,2,1],然后是[2,1,2]

或者,在这个更长的示例中:

[1,2,1,2,2,1,1] => [1,2,1]
[2,1,2,2,1,1] => [2,1,2]
[1,2,2,1,1] => [1,2,2]
[2,2,1,1] => [2,2,1]
[2,1,1] => [2,1,1]

只要列表只有2个元素,我就可以停止。

我假设三个值的每个列表都是您的[Elt1, Elt2, Elt3]

要计算此值,我们需要有一个输入列表和一个输出和,但是要递归到列表中,我们需要有一个累加器来跟踪当前的和。第一个谓词很简单:

compute(List,Sum) :- compute(List,0,Sum).

现在,您有5个谓词必须与之匹配。

  1. 包含2个元素的列表-我们可以返回累加器
  2. [Elt1 = Elt2然后是sum = sum + (elt1 + elt2)
  3. [Elt1 = Elt3然后是sum = sum + (elt1 * elt3)
  4. [Elt2 = Elt3Elt3 \= 0然后是sum = sum + (100 / elt3)
  5. 以上都不是,所以我们只使用当前的累加器,即sum = sum
compute([_,_],Sum,Sum).

compute([Elt1,Elt2,Elt3|Tail],AccNow,Sum) :-
    Elt1 = Elt2,
    !,
    AccNext is AccNow + Elt1 + Elt2,
    compute([Elt2,Elt3|Tail],AccNext,Sum).

compute([Elt1,Elt2,Elt3|Tail],AccNow,Sum) :-
    Elt1 = Elt3,
    !,
    AccNext is AccNow + Elt1 * Elt3,
    compute([Elt2,Elt3|Tail],AccNext,Sum).

compute([_,Elt2,Elt3|Tail],AccNow,Sum) :-
    Elt3 \= 0,
    Elt2 = Elt3,
    !,
    AccNext is AccNow + 100 / Elt3,
    compute([Elt2,Elt3|Tail],AccNext,Sum).

compute([_,Elt2,Elt3|Tail],Acc,Sum) :-
    compute([Elt2,Elt3|Tail],Acc,Sum).  

如果在?- compute([1,2,1,2],X).上尝试此操作,则得到X = 5。这与Elt1 = Elt3谓词匹配,给我0 + 1 * 1,然后再次与Elt1 = Elt3谓词匹配,给我1 + 2 * 25

如果在?- compute([1,2,1,2,2,1,1],X).上尝试此操作,则得到X = 159。我将它留给您,以确保它是正确的结果。

请记住,Prolog所做的所有努力都是成功的。如果要求证明目标(即compute/3),它将找到匹配的第一个谓词并尝试证明该目标(通过证明任何子目标),但如果失败,它将回溯至上一个选择点,然后尝试另一个选择并继续。如果证明了最初的目标,那就成功了。如果没有,则失败。没有返回值-只有绑定变量。

© www.soinside.com 2019 - 2024. All rights reserved.