我已经开始学习 PROLOG,但我对一个非常基本的示例有疑问。我正在使用 SWI PROLOG,代码如下:
is_true(a).
is_true(c).
is_true(d).
is_false(b).
is_false(e).
and(A,B) :- is_true(A),is_true(B).
nand(A,B) :- \+(and(A,B)).
然后:
[imanol@I56106 prolog]$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.6.4)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- consult(test).
% test compiled 0.00 sec, 8 clauses
true.
?- and(a,X).
X = a ;
X = c ;
X = d.
一切都是伟大的 ATM,我让 PROLOG 回溯了符合目标的所有可能值,并且 (A,B) 为 A=a。但是,如果我尝试实现目标 nand(A,B):
?- nand(a,X).
false.
要么它认为目标是不可能的,要么它不回溯,我一点也不知道为什么。:/
有人知道我做错了什么吗?
提前致谢。
PS:我也尝试过:
nand(A,B) :- not(and(A,B)).
它产生相同的结果。
编辑:看到我的问题对某些人来说很神秘:
我希望 PROLOG 给我一个变量 A 和 B 的值列表,这使得 and(A,B) 无法满足
EDIT2:我希望 PROLOG 告诉我:
?- nand(a,X).
X = e ;
X = b.