Prolog初学者(避免使用分号和if-else语句)

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

所以我想创建一个谓词,它将获取一个数字列表,并将每个条目的平方相加,如果它们可以被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.



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