代码之家  ›  专栏  ›  技术社区  ›  PROLOGik

Prolog实现和/2,或/2,nand/2,nor/2,xor/2[关闭]

  •  4
  • PROLOGik  · 技术社区  · 10 年前

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

    例如,也许有人可以向我展示如何实现和/2,这样我就可以自己完成其他任务并将其发布在这里。

    2 回复  |  直到 8 年前
        1
  •  8
  •   Cameron White    10 年前

    /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.
    
        2
  •  3
  •   mat    9 年前

    小心:你可能是说 and/3 而不是 and/2 .AND是一个三元谓词,定义了 3. 真理值,而不是2。当然,您可以使用Prolog的内置机制,而不是具体化(即使事情变得明确),其中的真值是隐含的。但首先,我将从三元关系开始,因为这使所有的真值都是明确的,并且让你也可以问例如:“哪个真值产生 false 对于给定的操作?“为了让你开始 和/3 ,我使用原子的地方 true 表示布尔值 真实的 :

    and(true, true, true).
    

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

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

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

    这表明,如果连词的第一个自变量为false,那么整个连词也是false。此外,例如,我们可以使用SICStus-Prolog的CLP(B)解算器来确定连合是可交换的,使用 taut/2

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

    或普遍量化的变量,表示为 原子 在里面 图书馆 :

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

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

    推荐文章