蓝翼冰激凌 2013-07-04 15:40 采纳率: 0%
浏览 1801

prolog的谓词\+的含义及其用法

代码:
path(X,Y,Path):- traverse(X,Y,[X],Q),reverse(Q,Path).

traverse(X,Y,P,[Y|P]):- connected(X,Y).
traverse(X,Y,V,Path):- connected(X,Z),Z\=Y, \+(member(Z,V)),traverse(Z,Y,[Z|V],Path).

其中,traverse(X,Y,V,Path):- connected(X,Z),Z\=Y, \+member(Z,V),traverse(Z,Y,[Z|V],Path).
上述规则中有一个谓词为 \+ /1,如果证明这个目标可以发现,最初的目标失败;如果没有证据可以发现,最初的目标成功。
这句规则在swi-prolog中可以实现,而在visual prolog中不可识别,总是出现如下的情况:
“traverse(X$23,Y$24,V$25,PATH$26) :- connected(X$23,Z$27) , Z$27 \= Y$24 , \+
Syntax error in parser
Reconsulted from: C:\Users\Xinxin\Desktop\pie(1)\Exe\FILE0.PRO”
在\+后面的member就不识别了,这是怎么回事?
我将它改为\+(member(Z,V)),加载的时候不会报错,但是这句还是没有起作用,这是为什么?
谢谢!

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-01 20:57
    关注

    在 Visual Prolog 中,'+' 用于表示取反操作符。例如:

    P = 2, Q = 3, \+(P < Q)
    

    将会解析成 P 的值是否不小于 Q 的值。


    在 SWI-Prolog 中,'+' 表示不存在证据的意思,类似于 'not' 关键字的作用。例如:

    \+(connected(X, Y)), connected(Y, X)
    

    表示如果没有证据证明 X 和 Y 之间有连接,则 Y 和 X 之间有连接。


    你在 Visual Prolog 中的代码可能会识别为一个取反的表达式,而不是一个不存在证据的表达式。


    尝试使用 'not' 关键字来替换 '+' 试试:

    traverse(X,Y,V,Path):- connected(X,Z),Z\=Y, not(member(Z,V)),traverse(Z,Y,[Z|V],Path).
    

    如果还是不行的话,你可以考虑使用 'not' 关键字来替换 '+' 并使用圆括号来替换方括号,如下所示:

    traverse(X,Y,V,Path):- connected(X,Z),Z\=Y, not(member(Z,V)),traverse(Z,Y,(Z|V),Path).
    

    这样可能会更容易被 Visual Prolog 识别。

    评论

报告相同问题?

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝