【问题标题】:Is it correct to use 'if' in Prolog this way?以这种方式在 Prolog 中使用“if”是否正确?
【发布时间】:2017-03-15 19:54:24
【问题描述】:

最近开始学习逻辑编程和使用Prolog,前几天发现在Prolog中也可以使用条件语句。
我想知道,如果我有一个必须调用的谓词两种情况,这样写代码是否正确:

process(args) :-
    (condition -> process_args1; process_args2),
    predicateCalledAnyway.

而不是在这两种情况下都调用它,像这样:

process(args) :-
    (condition -> process_args1, predicateCalledAnyway; process_args2, predicateCalledAnyway).

有什么不同吗?如果是,是什么以及为什么?对我来说,代码似乎在两种情况下都会产生相同的结果。

【问题讨论】:

    标签: if-statement prolog conditional


    【解决方案1】:

    这些形式编写的代码是等价的

    第一个版本更短,更容易发现通用部分。

    但是,请注意两个版本固有的更基本的问题:(->)/2 不纯地提交条件的第一个解决方案 ,并且一般来说,( Cond -> Then ; Else ) 只有在 Cond 被充分实例化时才有效。

    例如:

    ?- ( 成员(X, [a,b,c]) -> false ; true )。 错误。

    然而,添加一个约束突然使这成功了:

    ?- X = d, (成员(X, [a,b,c]) -> false ; true )。 X = d。

    声明式地,我们希望添加约束会导致特化,而不是泛化程序!

    因此,使用(->)/2 时要格外小心:通常,它会破坏 Prolog 程序最有价值的属性之一,即它们的关系性质,它允许您在多个方面使用谓词方向和模式。

    如果可能,请使用纯 Prolog 子句或纯 if_/3 谓词。另请参阅相关构造 (*->)/2if/3(在 SICStus 中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多