【问题标题】:Prolog implement and/2, or/2, nand/2, nor/2, xor/2 [closed]Prolog 实现 and/2, or/2, nand/2, nor/2, xor/2 [关闭]
【发布时间】:2013-10-28 10:29:44
【问题描述】:

我想在 prolog 中实现以下谓词并将它们用于真值表:and/2、or/2、nand/2、nor/2、xor/2

也许有人可以告诉我如何实施和/2,例如,我可以自己做其他人并将它们发布在这里。

【问题讨论】:

    标签: prolog implementation xor clpb nor


    【解决方案1】:

    /2 是可能的,实际上非常优雅。

    and(A,B) :- A,B.
    or(A,B) :- A;B.
    nand(A,B) :- not(and(A,B)).
    nor(A,B) :- not(or(A,B)).
    xor(A,B) :- or(A,B), nand(A,B).
    

    要使用,只需将 A/B 替换为 true/false。例如:

    ?- and(true,true).
    true.
    ?- and(false, true).
    false.
    

    【讨论】:

    • 使用 binary 关系,其中实际结果隐含在目标是否成功,您很难回答以下可能很重要的问题:哪些组合的真值产生false三元关系and/3 使这变得非常简单和明确:?- and(X, Y, false).。其他关系也是如此,当您明确显示真值时,它们都是三元谓词,以便在查询中易于访问。
    • 我会使用 /3,但问题是如何使用 /2。
    • 我不得不将 or 更改为 or(A,B) :- A -> true ;B.(SWI Prolog 语法)以避免选择点。
    【解决方案2】:

    注意:您可能指的是and/3,而不是and/2。 AND 是一个三元谓词,定义 3 个真值之间的关系,而不是 2。当然,您可以使用 Prolog 的内置机制,而不是具体化(= 使事情变得明确),其中真值是隐含的。但首先,我将从三元关系开始,因为这使得所有真值都变得明确,并且让您还可以询问例如:“对于给定的操作,哪些真值产生 false?”让您开始,为and/3 的真值表输入一个条目,其中我使用原子true 来表示布尔值true

    and(true, true, true).
    

    独立地,还可以考虑使用布尔约束,例如在 SICStus Prolog 和 GNU Prolog 中可用,并让您以声明方式表达真值和布尔表达式之间的关系。

    在 SICStus Prolog 中使用 library(clpb) 的示例:

    | ?- sat(X*Y =:= T), X = 0.
    X = 0,
    T = 0 ?
    

    这表明如果连词的第一个参数是假的,那么整个连词也是假的。此外,例如,我们可以使用 SICStus Prolog 的 CLP(B) 求解器来确定合取是可交换的,使用 taut/2

    | ?- taut(A*B =:= B*A, T).
    T = 1 ?
    

    或普遍量化的变量,在library(clpb)中表示为原子

    | ?- sat(a*b =:= b*a).
    yes
    

    因此,布尔约束在处理二进制值时可能是非常有用的工具。

    【讨论】:

    • 我被告知实施 and/2, or/2
    • ? - 塔菲尔(A,B,和(A,或(A,B)))。真真|真真失败|真失败真|失败失败失败|失败
    • 您可以写下像and(X, Y) 这样的术语,并且不需要为此实现任何东西:当您写下它时它就存在了。您要做 需要实现的是一个谓词,它将这些术语与真值相关联。从expression_truth/2 开始。示例子句:expression_truth(true, true).。留作练习:expression_truth(and(X,Y), Truth) :- ...,它将and(X, Y) 形式的术语与其真值相关联。
    • 感谢您的提示,我今天没有成功,但我有一个想法,我会尽快尝试解决。我们还有很多事情要做,这真的很耗时。不过谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2018-11-18
    • 2018-02-08
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多