【发布时间】:2020-03-14 05:01:31
【问题描述】:
我是 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 谓词/运算符。
非常感谢任何帮助或建议。
【问题讨论】:
你还在考虑功能
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)
并考虑通过p_f(x,y,_) 流入这个表达式的信息,通过p_f(_,_,a), p_g(a,_) 转移到p_g/2 并通过p_g(a,b) 流出表达式。
而 p_f/3 或 p_g/2 将 fail (返回 false,不是在它们的任何论点中,而是作为一个整体)如果他们无法将他们的论点联系起来,那么就没有结果。
使用谓词的好处是,对于 p_f(x,y),如果 y 已知,则可以请求 x,y 如果 x 是已知的,或有效的 (x,y) 对(只要计算上可行并且谓词已正确编码)。或者对于谓词add/3:
【讨论】:
通过对数字表示的微小变化,我们可以编写一个很好的解决方案。更改是将数字 N 表示为 number(N)` 以避免 defaulty 表示(意思是“如果不是操作,则默认为数字):
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
【讨论】: