If statement 使用'-&燃气轮机';在序言中

If statement 使用'-&燃气轮机';在序言中,if-statement,prolog,If Statement,Prolog,我想生成一个由子列表组成的列表,其中包含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个整数及其总和和乘积

预期的结果是

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).
get(4,5,[]):-!。
获取(N,M,[[N,Q,S,P]|列表]:-
Q是M+1,
S是N+Q,
S=<10->
P是N*Q,
get(N,Q,List);
X是N+1,
获取(X,X,List)。
获取(列表):-get(2,2,列表)。

我认为问题在于在我的代码中使用->的问题,但我不知道如何解决它,我认为->的逻辑是正确的:
如果S=(->)/2的运算符优先级高于
(,)/2的运算符优先级。因此,(,)/2
作为(->)/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是M+1,
S是N+Q,
S=<10->
P是N*Q,
get(N,Q,List);
X是N+1,
获取(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).
get(N,M,[[N,Q,S,P]| List]):-
(Q是M+1,
S是N+Q,
S=<10)->
P是N*Q,
get(N,Q,List);
X是N+1,
获取(X,X,List)。
结果是当 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)).
get(N,M,[[N,Q,S,P]| List]):-
Q是M+1,
S是N+Q,
(S=<10->
P是N*Q,
获取(N,Q,List)
;X是N+1,
获取(X,X,List))。
但即使有了这个修正,p也有一个问题 在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).
get(N,M,[[N,Q,S,P]| List]):-
Q是M+1,
S是N+Q,
S=<10
-> 
P是N*Q,
获取(N,Q,List)
;  X是N+1,
获取(X,X,List)。
当您像这样排列代码时,很明显整个子句是if-then-else,前3行是“if”部分。(尽管我不反对简最终版本的布局。)