【问题标题】:How to write Prolog - defining basic operators?如何编写 Prolog - 定义基本运算符?
【发布时间】:2020-03-14 05:01:31
【问题描述】:

我是 Prolog 的新手,我想创建一个行为如下的谓词

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

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

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

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

【问题讨论】:

    标签: prolog prolog-defaulty


    【解决方案1】:

    你还在考虑功能

    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/3p_g/2fail (返回 false,不是在它们的任何论点中,而是作为一个整体)如果他们无法将他们的论点联系起来,那么就没有结果。

    使用谓词的好处是,对于 p_f(x,y),如果 y 已知,则可以请求 xy 如果 x 是已知的,或有效的 (x,y) 对(只要计算上可行并且谓词已正确编码)。或者对于谓词add/3

    • add(2,3,X) -> X = 5
    • add(2,3,5) -> 真
    • add(X,3,5) -> X = 2
    • add(1,3,5) -> 错误
    • 添加(X,Y,5) -> X = 2, Y = 3; X = 3,Y = 2; ... 无止境
    • add(X,Y,Z) -> 和上面一样,只是更加无拘无束

    另请参阅:Prolog ~ Splitting a number into a list

    【讨论】:

      【解决方案2】:

      通过对数字表示的微小变化,我们可以编写一个很好的解决方案。更改是将数字 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
      

      【讨论】:

      • 很好地注意到 defaulty
      • @GuyCoder 谢谢。有关默认表示的更多信息,请参阅以下博客文章:logtalk.org/2019/12/17/…
      • 我添加评论的原因是因为这个问题看起来像班级已经开始了一个新的部分,而且正如你所知,在创建这些谓词时,如果他们不理解这些概念,就会产生让这些谓词更加努力地协同工作,您是少数在答案中使用 defaulty 的人之一,这是正确解决此类问题所需的关键概念之一。 Markus 在 defaulty 上也有一个不错的部分,但我把它留给那些寻求它的人。
      • 如果你没有注意到,现在它已经被批准了,有一个标签 prolog-defaulty 引用你的博客。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2012-07-09
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多