我对 Prolog 还很陌生,我想创建一个行为如下的谓词
calculate(add(1, sub(4,1)),Result).
Result = 4.
这是在做:1 + (4 - 1) = 4
我熟悉谓词,但我不知道从哪里开始编写 add//2 谓词/运算符。
非常感谢任何帮助或建议。
我对 Prolog 还很陌生,我想创建一个行为如下的谓词
calculate(add(1, sub(4,1)),Result).
Result = 4.
这是在做:1 + (4 - 1) = 4
我熟悉谓词,但我不知道从哪里开始编写 add//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
你还在考虑功能
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/2
viap_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
另请参阅:Prolog ~ 将数字拆分为列表