Prolog技术疑问:如何返回指定变量与检查变量特定类型
刚接触Prolog确实容易被它的逻辑式思维搞懵,毕竟和咱们熟悉的命令式语言“返回值”那套思路完全不一样~我来一步步帮你解决这两个问题:
问题1:实现
alternate/2谓词(实现你说的“返回指定变量”效果) 首先得明确:Prolog里没有“返回值”的概念,它是通过变量绑定来传递结果的。你想要的效果,本质是让谓词在给定一个输入时,把另一个变量绑定到对应的结果上。
针对你的需求,我们可以直接定义两个事实:
alternate(first, second). alternate(second, first).
这样使用的时候:
- 如果你想从
first得到对应的结果,就查alternate(first, X).,Prolog会把X绑定为second——这就是你要的“返回second”的效果; - 反过来,查
alternate(second, X).,X会被绑定为first; - 甚至可以双向查询:比如查
alternate(X, first).,Prolog会告诉你X = second,这也是Prolog逻辑式编程的灵活之处。
如果直接调用alternate(first, second).,Prolog会返回true,因为这个事实是我们定义好的——这相当于验证两个值是否符合alternate的关系。
问题2:实现
ispair/1谓词检查是否为pos(X,Y)类型 Prolog里的“类型”其实更多是**结构(functor)**的概念,pos(X,Y)是一个以pos为函子、拥有两个参数的结构。我们可以直接通过结构匹配来实现这个谓词:
基础版本(允许未绑定变量的结构匹配)
ispair(pos(_, _)).
这个谓词的意思是:只要参数是pos(任意值, 任意值)的结构,就匹配成功。比如:
ispair(pos(1, 2)).→ 返回trueispair(pos(a, b)).→ 返回trueispair(pos(X, Y)).→ 返回true(哪怕X、Y是未绑定变量,只要结构是pos/2就符合)ispair(hello).→ 返回falseispair(pos(1)).→ 返回false(因为pos需要两个参数,这里只有一个)
进阶版本(排除未绑定变量的情况)
如果你希望当输入是一个未绑定的变量时,ispair/1直接返回false(而不是自动生成pos(_,_)的结构),可以加上nonvar/1检查:
ispair(Pair) :- nonvar(Pair), % 确保Pair不是未绑定的变量 Pair = pos(_, _).
这样查询ispair(X).时,因为X是未绑定变量,nonvar(X)失败,整个谓词就会返回false,更符合“检查已有值是否为特定类型”的需求。
内容的提问来源于stack exchange,提问作者csvr
相关产品推荐
相关产品推荐

