【问题标题】:How to do Arithemetic?如何做算术?
【发布时间】:2023-03-24 06:04:02
【问题描述】:
:- dynamic somepig/1.

runtest :-
    assert(somepig(6)), % Edit : just to be more precise, somepig is dynamic
    somepig(X),
    writeln(X+3).

此代码最终打印“6+3”。我猜要么 X 采用无法进行算术运算的类型,要么当我分配“somepig”时,“6”会自动被视为字符串或其他类型。

我是否可以明确指定 X 为整数或其他?也许是这样的?

runtest :-
    somepig(X is int)
    writeln(X+3). % outputs 9

【问题讨论】:

  • @skin 在标准 Prolog 中无法声明变量类型。您可以使用诸如number/1 之类的谓词来限制变量的域,但无论如何(如下所述)这不是您的问题。

标签: prolog


【解决方案1】:

为了让 prolog 将某事识别为算术计算,您必须使用 is 显式声明它:

runtest :-
    somepig(X)
    Y is X + 3,
    writeln(Y). % outputs 9

更多详情请见this answer

【讨论】:

  • 是否有任何其他语法,会无缘无故地创建双变量名称。
  • 我认为没有。在序言中没有使用“函数调用”的“结果”之类的东西,您需要将它与另一个变量统一起来。 (当然,可以围绕实现创建语法糖,但我认为这不会真正使语言受益。)另外,如果将变量数量加倍确实是一个问题,您可能应该简化您的谓词使用。
  • 大声笑是认真的吗?我必须做 4-5 次简单的加法/减法。由于 prolog 处理算术的方式,这会让我的代码变得臃肿。
  • @Steven 你不是在“声明”算术。您正在使用 is/2 将算术表达式与值相关联。不幸的是,这种关系只能以一种方式起作用。 (我们中的许多人更喜欢 clpfd/clpqr,因为它没有这个限制。)
  • @skin Prolog 以其冗长而著称,它并不是特别适合数字代码。它还有其他优势,幸运的是我们发现我们可以依赖其他所有编程语言来完成类似的事情。不过,我同意 Steven 的观点,除非您严重误解了某些内容,否则您不应该经历变量的“加倍”。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多