Prolog初学者(避免使用分号和if-else语句)
所以我想创建一个谓词,它将获取一个数字列表,并将每个条目的平方相加,如果它们可以被5或3整除 因此,如果我有列表[6,7,9,10],它将返回Prolog初学者(避免使用分号和if-else语句),prolog,Prolog,所以我想创建一个谓词,它将获取一个数字列表,并将每个条目的平方相加,如果它们可以被5或3整除 因此,如果我有列表[6,7,9,10],它将返回 6^2+9^2+10^2 到目前为止,我所做的是: sumsquared([], 0). sumsquared([Head|Tail], Sum):- divisible(Head), sumsquared(Tail, Sumofrest), Sum is Head*Head + Sumofrest. divisib
6^2+9^2+10^2
到目前为止,我所做的是:
sumsquared([], 0).
sumsquared([Head|Tail], Sum):-
divisible(Head),
sumsquared(Tail, Sumofrest),
Sum is Head*Head + Sumofrest.
divisible(Head):-
0 is Head mod 3.
divisible(Head):-
0 is Head mod 5.
这段代码适用于[3,6,9,10]和类似的东西,但是当我们有一个列表说[2,3,6,9,10]时,prolog会给它一个false。这是因为我的代码中有可分割的(头)。我试图寻找一种方法来解决这个问题,而不用在Prolog中使用“if-else语句”或“;”。您的第二个sumsquare/2子句涉及列表的第一个元素是可整除的情况。您需要添加第三条,以涵盖不适用的情况。您的思路是正确的。您的代码中缺少一些内容 首先,你只处理了“可分割”的情况。因此,如果一个列表项不可分割,那么整个目标就失败了 接下来,在不使用
->
或的情况下表示不可分割的代码>应用
德摩根定律:
divisible(X) :- X mod 3 =:= 0.
divisible(X) :- X mod 5 =:= 0.
non_divisible(X) :- X mod 3 =\= 0,
X mod 5 =\= 0.
sumsquared([], 0).
sumsquared([Head|Tail], Sum):-
divisible(Head),
sumsquared(Tail, Sumofrest),
Sum is Head*Head + Sumofrest.
sumsquared([Head|Tail], Sum) :- % new clause
non_divisible(Head),
sumsquared(Tail, Sum).
让我们再次测试您提供的查询:
?- sumsquared([6,7,9,10], Sum).
Sum = 217 ;
false.
您应该能够这样调用上述命令:
compute_sum_of_list_squaring_certain_multiples( [1,2,3,4,5,6] , [3,5] , R ) .
得到
R = 41
transform/2
不稳定。
R = 41