我是新手,因此请练习练习。目前,我对第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中的概念。您最初的尝试充满了原子(小写)而不是变量(大写)。它具有可变性。您在想像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个谓词必须与之匹配。
Elt1 = Elt2
然后是sum = sum + (elt1 + elt2)
Elt1 = Elt3
然后是sum = sum + (elt1 * elt3)
Elt2 = Elt3
和Elt3 \= 0
然后是sum = sum + (100 / elt3)
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 * 2
或5
。
如果在?- compute([1,2,1,2,2,1,1],X).
上尝试此操作,则得到X = 159
。我将它留给您,以确保它是正确的结果。
请记住,Prolog所做的所有努力都是成功的。如果要求证明目标(即compute/3
),它将找到匹配的第一个谓词并尝试证明该目标(通过证明任何子目标),但如果失败,它将回溯至上一个选择点,然后尝试另一个选择并继续。如果证明了最初的目标,那就成功了。如果没有,则失败。没有返回值-只有绑定变量。