使用' - >'在prolog

时间:2016-03-13 00:31:00

标签: 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,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 ...

2 个答案:

答案 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的最终版本布局。)