0

我对 Prolog 还很陌生,我想创建一个行为如下的谓词

calculate(add(1, sub(4,1)),Result).
Result = 4.

这是在做:1 + (4 - 1) = 4

我熟悉谓词,但我不知道从哪里开始编写 add//2 谓词/运算符。

非常感谢任何帮助或建议。

4

2 回答 2

2

通过对数字表示的微小变化,我们可以编写一个很好的解决方案。更改是将数字表示N为 number(N)` 以避免默认 表示(意思是,“如果不是操作,则默认为数字):

calculate(number(Number), Number).
calculate(add(Expression1, Expression2), Result) :-
    calculate(Expression1, Result1),
    calculate(Expression2, Result2),
    Result is Result1 + Result2.
calculate(sub(Expression1, Expression2), Result) :-
    calculate(Expression1, Result1),
    calculate(Expression2, Result2),
    Result is Result1 - Result2.

示例调用:

| ?- calculate(add(number(1), sub(number(4), number(1))), Result).

Result = 4
yes
于 2020-03-14T09:02:55.550 回答
2

你还在考虑功能

z = f(x,y)“f(x,y) 返回(被替换/减少为)值 z ...”

谓词值与其他值相关:

p_f(x,y,z)“谓词 p_ 建立关系/连接/链接值 (x,y,z),使得 z = f(x,y)”

所以管道评估(数学符号(g°f)(x,y)

g(f(x,y))

你必须写(不尊重'变量'在这里用大写写的Prolog约定):

p_f(x,y,a),p_g(a,b)

并且从信息流入这个表达式的角度来思考via p_f(x,y,_),转移到p_g/2viap_f(_,_,a), p_g(a,_)和流出表达式 via p_g(a,b)

如果p_f /3或 p_g/2无法关联他们的论点并且没有结果,那么p_f/3或p_g/2失败(返回 false,不是在他们的任何论点中,而是作为一个整体)。

使用谓词的优点是,对于p_f(x,y) ,如果y已知,您可以请求x ,如果x已知,则可以请求y,或者有效的(x,y)对(只要在计算上是可能的并且谓词已经正确编码)。或者对于谓词:add/3

  • 添加(2,3,X)-> X = 5
  • 添加(2,3,5)-> 真
  • 添加(X,3,5)-> X = 2
  • 添加(1,3,5)-> 假
  • 添加(X,Y,5)-> X = 2,Y = 3;X = 3,Y = 2;... 无止境
  • add(X,Y,Z) -> 与上面相同,只是更加无拘无束

另请参阅:Prolog ~ 将数字拆分为列表

于 2020-03-14T08:01:00.243 回答