• prolog --寻找neni (2)


    混合查询

    我们可以把简单的查询连接起来,组成复杂的查询。

    ?- location(X,kitchen),edible(X).

    简单查询只有一个目标,而混合查询可以把这些目标连接起来。从而进行较为复杂的查询。

    , 合取  且 的意思。

    该查询意思为:寻找满足条件的X,条件是:X位于kitchen中,且可以吃(具有edible属性)

    如果某个变量在查询中多次出现,那么此变量在所有出现的位置都必须绑定相同的值,所以该查询,只有找到一个X 得值,使得两个目标都成立,才算查询成功。

    每次查询所使用的都是局部变量。

    除了使用逻辑的方式理解混合查询外,还可以通过分析程序运行步骤的方式来理解

    如该查询可以这么理解:首先找到一样位于厨房的东西,然后判断它是否能吃。

    如果不能,那就找到下一样东西,在判断能否使用,直至找到答案,或者是把厨房的东西都查找完毕。

    [debug] 2 ?- location(X,kitchen),edible(X).
     T Call: (8) location(_G533, kitchen)
     T Exit: (8) location(broccoli, kitchen)  %匹配第一个子句成功
     T Call: (8) edible(broccoli)   %匹配第二个子句
     T Fail: (8) edible(broccoli)   %匹配第二个子句失败,解除第一个子句的绑定,回溯上一个匹配成功的子句,发现并没有,回溯到最开始状态。 
     T Redo: (8) location(_G533, kitchen)  %重新匹配第一个子句
     T Exit: (8) location(crackers, kitchen)
     T Call: (8) edible(crackers)  % 匹配第二个子句
     T Exit: (8) edible(crackers)  %匹配成功,绑定X,同时显示
    X = crackers ;
     T Redo: (8) location(_G533, kitchen)
     T Exit: (8) location(apple, kitchen)
     T Call: (8) edible(apple)
     T Exit: (8) edible(apple)
    X = apple.
    
    [debug] 3 ?- 

    上面为一个变量的。下面是两个变量的。

    ?- door(kitchen,R),location(T,R).

    意思:找到和kitchen有们相邻的R,找到位于R中的T

    [debug] 3 ?- door(kitchen,R),location(T,R).
     T Call: (8) door(kitchen, _G534)
     T Exit: (8) door(kitchen, office)  %匹配第一个子句成功
     T Call: (8) location(_G536, office)  %开始匹配第二个子句
     T Exit: (8) location(desk, office)   %匹配第二个子句,
    R = office,
    T = desk ;
     T Redo: (8) location(_G536, office)  %释放 T,重新在上一次匹配成功的子句后面寻找其他符合目标的条目
     T Exit: (8) location(computer, office)  % 再次找到符合条目,绑定,显示
    R = office,
    T = computer ;
     T Redo: (8) door(kitchen, _G534) %SWI-prolog的原因,没有显示上面那次location匹配失败,重新开始匹配door子句,
     T Exit: (8) door(kitchen, cellar)   %找到 door 子句 绑定 R cellar
     T Call: (8) location(_G536, cellar)   % 查找 location子句
     T Exit: (8) location('washing mechine', cellar)
    R = cellar,
    T = 'washing mechine'.
    
    [debug] 4 ?- 

     如图所示,由于SWI-prolog的不显示 fail 的原因,所以,我同样copy一份教程上的 debug 调试信息

    ?-door(kitchen,R),location(T,R).
    
    call door(kitchen,R)  %匹配第一个子句
    exit(2)  door(kitchen,office) 
    call  location(T,office)  %第一个子句匹配成功之后,匹配第二个子句
    exit(1)  location(desk,office)
    R = office
    T = desk
    
    redo location(T,office) %释放掉T,重新开始查询剩余的与location相匹配的条目
    exit(8) location(computer,office)  %匹配成功
    R = office
    T = computer           
    
    redo  location(T,office)   %释放掉 T ,再次查询剩余的与location相匹配的条目
    fail  location(T,office)   % 查询失败,释放掉 R,返回上一次匹配成功的子语句,发现并没有,所以会到最初状态
    
    
    redo door(kitchen,R)    % 在最开始匹配成功的条目后面,查找剩余的和door相匹配的条目
    exit(4) door(kitchen,cellar)  %匹配door成功,帮定R
    call  location(T,cellar)   %开始查找第二个子句
    exit(4) location('washing room',cellar)  %查找成功,绑定R,显示R,T
    R = cellar
    T = 'washing room'
    
    redo location(T,cellar)  %释放 T,重新开始查找剩下的和location相匹配的条目
    fail location(T,cellar)  % 查找失败 释放已经绑定的R,返回上一次匹配成功的子句,发现没有,会到最初状态
    
    redo  door(kitchen,R)  % 重新查找剩余的和door相匹配的条目
    fail  door(kitchen,R)   %查找失败结束所有查找
    no 
  • 相关阅读:
    LeetCode. 476. Number Complement
    LeetCode 172.Factorial Trailing Zeroes
    原码,反码,补码笔记
    python3笔记
    django笔记(python web框架)
    mysql 8.0 主从复制配置
    centos 7系统安装mysql 8.0
    MobaXterm无法退格删除
    Oracle数据泵常用命令
    oracle查年度周末日期
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/6204064.html
Copyright © 2020-2023  润新知