逻辑门AND in swi-prolog

时间:2018-04-15 13:12:34

标签: prolog boolean-logic

如何获得以下Prolog程序

and(1,1,1).
and(1,0,0).
and(0,1,0).
and(0,0,0).
分别给出以下答案

?- and(A,B,C).
A=1, B=1, C=1;
A=1, B=0, C=0;
A=0, B=1, C=0;
A=0, B=0, C=0.

当我尝试运行上面的程序时,我得到以下结果

?- and(A,B,C).
A = B, B = C, C = 0 ;
A = C, C = 0,
B = 1 ;
A = 1,
B = C, C = 0 ;
A = B, B = C, C = 1.

这似乎是正确的,但我不想在我的答案中有变量,这缩写了我的预期答案。

如果我运行GNU Prolog的示例,我只得到atom作为Variable的答案而不是对Variable本身的引用。这也是我想要的swi-prolog:

GNU Prolog 1.4.5 (64 bits)
Compiled Feb  5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
| ?- und(A,B,C).

A = 1
B = 1
C = 1 ? ;

A = 1
B = 0
C = 0 ? ;

A = 0
B = 1
C = 0 ? ;

A = 0
B = 0
C = 0

这个例子也在第10页的PDF file中。

我在Ubuntu 17.10上为amd64运行SWI-Prolog版本7.4.2

谢谢!

//编辑:更正了逻辑AND的结果。 // edit2:从GNU Prolog中添加了示例,结果应如何。

1 个答案:

答案 0 :(得分:3)

首先,正如评论中已经提到的,您的谓词and/3并未描述您引用的PDF中的逻辑AND。第10页的定义是:

and(0,0,0).
and(0,1,0).
and(1,0,0).
and(1,1,1).

其次,如果它只是关于最常见查询的输出,你可以编写一个arity 1的包装谓词,它显示两个参数,结果显示为三元组:

and(A-B-C) :-
   and(A,B,C).

如果您使用单个变量查询and/1,则会得到与您帖子中的输出类似的输出:

?- and(X).
X = 0-0-0 ;
X = 0-1-0 ;
X = 1-0-0 ;
X = 1-1-1.

如果您使用三个变量查询and/1,则会得到与and/3的最常规查询相同的答案:

?- and(A-B-C).
A = B, B = C, C = 0 ;
A = C, C = 0,
B = 1 ;
A = 1,
B = C, C = 0 ;
A = B, B = C, C = 1.

?- and(A,B,C).
A = B, B = C, C = 0 ;
A = C, C = 0,
B = 1 ;
A = 1,
B = C, C = 0 ;
A = B, B = C, C = 1.

修改

在上面的示例中,您可以观察Prolog提供的每个答案如何替换查询中出现的每个变量,以便这些替换满足关系。这是"技巧中使用的属性"在使用参数and/1查询X时,上面只有一个变量可以提供答案替换。您可以通过定义arity 0的输出谓词来更进一步。然后Prolog只能在成功的情况下回答true,因为查询中没有变量可以提供替换,并且您可以使用谓词如{ {3}}根据自己的喜好创建输出。例如:

andoutput :-
   and(A,B,C),
   format('A = ~d, B = ~d, C = ~d~n', [A,B,C]).

查询此谓词会产生所需的输出:

?- andoutput.
A = 0, B = 0, C = 0    % <- output by format/2
true ;                 % <- Prolog's answer
A = 0, B = 1, C = 0    % <- output by format/2
true ;                 % <- Prolog's answer
A = 1, B = 0, C = 0    % <- output by format/2
true ;                 % <- Prolog's answer
A = 1, B = 1, C = 1    % <- output by format/2
true.                  % <- Prolog's answer

请注意谓词生成的输出与Prolog提供的答案之间的差异。如果您更喜欢与GNU-Prolog的答案更相似的输出,您可以定义如下内容:

andoutput2 :-
   and(A,B,C),
   format('~nA = ~d~nB = ~d~nC = ~d~n', [A,B,C]).

?- andoutput2.
         % <- output by format/2
A = 0    % <- output by format/2
B = 0    % <- output by format/2
C = 0    % <- output by format/2
true ;   % <- Prolog's answer
         % <- output by format/2
A = 0    % <- output by format/2
B = 1    % <- output by format/2
C = 0    % <- output by format/2
true ;   % <- Prolog's answer
         % <- output by format/2
A = 1    % <- output by format/2
B = 0    % <- output by format/2
C = 0    % <- output by format/2
true ;   % <- Prolog's answer
         % <- output by format/2
A = 1    % <- output by format/2
B = 1    % <- output by format/2
C = 1    % <- output by format/2
true.    % <- Prolog's answer

但是,请记住,这只是格式化输出,并不会改变Prolog提供答案的方式。因此,对于您希望以个性化方式回答的每个谓词,您必须提供输出谓词。要查看更多用于生成输出的选项,请查看format/2上的文档。