Prolog嵌套谓词内的变量是否存在共指关系?
关于Prolog子句中同名变量共指的问题
完全成立。Prolog的变量作用域是整个子句,不管变量出现在子句里的哪个位置——哪怕嵌套在不同的谓词实例(比如你代码里的两个state)中,只要是同一个子句内的同名变量,就必然指向同一个对象。
拿你给出的代码举例:
can_do(state(Photographer_location, Camera_location, Holding_camera_or_not, CameraState, Last_place_photographed), go(Photographer_location, Place), state(Place, Camera_location, Holding_camera_or_not, CameraState, Last_place_photographed)) :- place(Place), Photographer_location \= Place.
这里的Camera_location、Holding_camera_or_not等变量,不管是在第一个state还是第二个state里,都是同一个变量,Prolog会自动约束它们的值完全一致,不需要你手动添加额外的约束条件。
这是因为Prolog的变量绑定基于子句级别的作用域,只要变量名相同且处于同一个子句内,就代表同一个逻辑实体。不同的谓词实例只是变量的载体,不会改变变量的作用域规则。
你完全不用手动逐一约束,当前的写法是正确且简洁的。
内容的提问来源于stack exchange,提问作者Dan Öz
相关产品推荐
相关产品推荐

