Prolog箭头运算符

Prolog箭头运算符,prolog,logic,Prolog,Logic,据我所知,“是”/“否”结果告诉用户查询是否成功。查询在谓词true上总是成功的,而在false上总是失败的 自/2表示或(可交换)前两个查询应相等(均成功) 在谓词逻辑中,公式(true->false)和false计算为false,因此最后两个查询应该是等价的 因此:第二个查询似乎与理论逻辑不一致 我的推理有错误吗?我觉得我没有理解一些基本的东西。序言中的箭头与一阶逻辑中的实质含义不符。它是一个三元“if-then-else”运算符,带有可选选项。因为它是用Prolog语法实现的 | ?- t

据我所知,“是”/“否”结果告诉用户查询是否成功。查询在谓词
true
上总是成功的,而在
false
上总是失败的

  • 自<代码>/2表示或(可交换)前两个查询应相等(均成功)

  • 在谓词逻辑中,公式
    (true->false)
    false
    计算为false,因此最后两个查询应该是等价的

  • 因此:第二个查询似乎与理论逻辑不一致


    我的推理有错误吗?我觉得我没有理解一些基本的东西。

    序言中的箭头与一阶逻辑中的实质含义不符。它是一个三元“if-then-else”运算符,带有可选选项。因为它是用Prolog语法实现的

    | ?- true ; (true->false)
    yes
    | ?- (true->false) ; true.
    no
    | ?- false ; true.
    yes
    
    并不意味着你认为它能做什么。它被解析为
    true->false;正确

    (true -> false) ; true
    

    所以它失败了,因为它意味着“如果
    true
    那么
    false
    否则
    true
    ”,也就是说
    false
    ,这是一个非常好的问题

    为了详细说明@larsmans的答案,
    ->/2
    谓词在与
    组合时充当
    if-then-else
    /2
    谓词。就其本身而言,它只是
    if-then

    查看
    if-then-else
    结构,以下内容中给出了描述:

    ->/2
    经常与
    组合/2
    定义一个
    if-then els
    e如下:
    Goal1->Goal2;Goal3.
    注意,
    Goal1->Goal2
    是第一个参数 (;)/2和Goal3(else部分)的第二个参数。这样的
    if-then-else
    控件构造首先为 else部分(直观地与
    ;/2
    )关联),然后执行
    目标1
    。 如果[在
    Goal1
    ]中]成功,则由
    Goal1
    创建的所有选择点与 删除else零件的选择点并执行Goal2。 如果目标1失败,则执行目标3

    在这种情况下,我们有:

    ?- ((true -> false) ; true) =.. Expr.
    Expr = [;, (true->false), true].
    
    ?- (true -> false ; true) =.. Expr.
    Expr = [;, (true->false), true].
    
    第一个
    true
    Goal1
    ,它成功了。一旦发生这种情况,根据谓词行为的描述,将删除引导您到第二个
    true
    语句(
    Goal3
    )的选择点。因此,当遇到
    false
    时,会出现故障,并且不会回溯到第二个
    true
    ,整个查询都会失败

    但是,如果您做了如下操作:

    (true -> false) ; true
    
    在第一个
    foo
    子句失败后有一个选择点,因此您得到:

    foo :-
        true -> false.
    foo :-
        true
    

    我认为混淆源于比较
    false;带
    (真->假)的true
    ;正确
    。与
    (true->false)更相似的表达式;正确的
    是:

    | ?- foo.
    yes.
    

    由于
    的原因,它也将计算为
    false
    工作。
    在第一个子句失败时提供一个选择点。但是,如果第一个子句有一个切分并删除了选择点,那么它将不会被接受,整个查询将失败。

    你的意思是说“如果
    true
    那么
    false
    否则
    true
    ”?@octavian:嗯,是的。修正了这个问题。表达式不能被视为
    ;(>(真、假)、真)
    ?在这种情况下,如何“删除else部分的选择点[…]”,因为“->/2”是“”/2',所以它不应该改变它的定义?@octavian,如果你拿
    的类似例子来说,实际上它是一致的;((真、!、假)、假)
    。该查询将返回
    false
    ,因为即使第一个表达式是
    false
    ,选择点也已被切掉。我对我的回答作了进一步的解释。这确实是一个难得的好问题和有趣的问题我只想补充一点,省略假选项是很自然的(
    (true->false;false);true.
    ),这个问题表明在序言中我们应该非常小心。@octavian我的答案令人满意吗?
    (true, !, false) ; true