我想生成一个由子列表组成的列表,其中包含2个整数及其总和和产品。
预期结果是
A = [[2,3,5,6],[2,4,6,8],[2,5,7,10],[2,6,8,12],
[2,7,9,14],[2,8,10,16],[3,4,7,12],[3,5,8,15],
[3,6,9,18],[3,7,10,21],[4,5,9,20]].
但我保留了一些没有总和和产品的子列表:
?- get(A).
A = [[2,3,5,6],[2,4,6,8],[2,5,7,10],[2,6,8,12],
[2,7,9,14],[2,8,10,16],[2,_G419,_G422,_G425],
[3,4,7,12],[3,5,8,15],[3,6,9,18],[3,7,10,21],
[3,_G530,_G533,_G536],[4,5,9,20]].
这是我的代码:
get(4,5,[]):-!.
get(N,M,[[N,Q,S,P]|List]):-
Q is M + 1,
S is N + Q,
S =< 10 ->
P is N * Q,
get(N,Q,List);
X is N + 1,
get(X,X,List).
get(List):-get(2,2,List).
我认为问题是关于使用 - &gt;在我的代码中,但我不知道如何解决它,我认为关于 - &gt;的逻辑是对的:if S=<10, then calculate the product and the other value with N and Q; else calculate N+1 and N+2 and ...
答案 0 :(得分:1)
( - &gt;)/ 2的运算符优先级高于 (,)/ 2的运算符优先级。结果是(,)/ 2 被组合在一起作为( - &gt;)/ 2的参数。
所以你的规则:
get(N,M,[[N,Q,S,P]|List]):-
Q is M + 1,
S is N + Q,
S =< 10 ->
P is N * Q,
get(N,Q,List);
X is N + 1,
get(X,X,List).
基本上由解释器读取:
get(N,M,[[N,Q,S,P]|List]):-
(Q is M + 1,
S is N + Q,
S =< 10) ->
P is N * Q,
get(N,Q,List);
X is N + 1,
get(X,X,List).
结果是Q ans S未绑定 如果不满足if条件和else 部分被执行。您可以通过介绍来修复代码 附加括号:
get(N,M,[[N,Q,S,P]|List]):-
Q is M + 1,
S is N + Q,
(S =< 10 ->
P is N * Q,
get(N,Q,List)
; X is N + 1,
get(X,X,List)).
但即使有了这个问题,P也存在问题 在其他分支中未被绑定。
为清楚起见,您甚至可以尝试不使用解决方案 if-then-else,例如见这里 Prolog removing IF THEN ELSE
答案 1 :(得分:0)
我同意Jan,但我想提出一个关于格式化的观点。因为;和 - &gt;如此强烈地影响程序的含义,将这些操作符放在一行的末尾是不正确的(这意味着难以理解)。
get(N,M,[[N,Q,S,P]|List]):-
Q is M + 1,
S is N + Q,
S =< 10
->
P is N * Q,
get(N,Q,List)
; X is N + 1,
get(X,X,List).
当您安排这样的代码时,很明显整个子句是if-then-else,前3行是&#39; if&#39;一部分。 (虽然我不会反对Jan的最终版本布局。)