gpt4 book ai didi

prolog - 实现诸如 diff/2 等谓词的指南

转载 作者:行者123 更新时间:2023-12-04 18:27:17 35 4
gpt4 key购买 nike

假设我有一个谓词 foo/2它定义了它的第一个和第二个参数之间的关系。

什么是改变foo/2的最惯用和最有效的方式使得:

  • 如果它的两个参数都成立,则它像以前一样(如果关系成立则成功,否则失败)。
  • 如果两个参数中的一个(或两个)是自由的,它会“约束”这两个参数,以便当它们被接地时,将检查关系。

  • 换句话说,如何正确实现 dif/2 展示的行为但是有任何类型的用户定义关系?
    listing(dif/2).帮助不大。

    最佳答案

    不同的 Prolog 实现提供了不同的功能来实现这一点。该机制被称为协程、延迟目标、约束,您的 Prolog 系统手册将提供更多信息。

    这里有两个变体,可在 SICStus Prolog 中找到。以及其他一些系统。
    block/1指示

    在 SICStus Prolog(可能还有一些其他系统)中,通过声明式 block declaration 提供了一种将用户定义的谓词提升到这种约束版本的方法。 .

    有趣的是,这不需要对谓词本身进行任何更改!

    假设您有一个不纯版本的 dif/2 ,使用非单调(\=)/2谓词:

    madif(X, Y) :-
    X\= Y。

    然后您可以将其转换为延迟版本,例如:

    :- 阻止 madif(-, ?),
    马迪夫(?,-)。

    madif(X, Y) :-
    X\= Y。

    示例查询和答案:

    | ?- madif(a, b)。
    是的
    | ?- madif(a, X)。
    用户:madif(a,X) ? ;

    | ?- madif(a, X), X = b。
    X = ? ;

    | ?- madif(X, Y)。
    用户:madif(X,Y)? ;


    根据需要,目标的评估被延迟,直到两个参数都被实例化。
    when/2
    使用 SICStus Prolog(以及提供此功能的其他系统)实现此目的的第二种方法是使用 when/2 .这需要对谓词本身进行更改。

    例如,使用 when/2 ,您可以执行 madif/2像这样:

    madif(X, Y) :-
    当((地面(X),
    地面(Y)),X\= Y)。

    示例查询和答案:

    | ?- madif(X, a)。
    序言:trig_ground(X,[],[X],_A,_A),
    序言:当(_A,(地面(X),地面(a)),用户:(X\= a))? ;

    | ?- madif(X, a), X = b。
    X = ? ;

    关于prolog - 实现诸如 diff/2 等谓词的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319010/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com