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 です。私は、A=a の目標と (A,B) に適合するすべての可能な値を PROLOG にバックトラックさせました。しかし、目標 nand(A,B) を試してみると:
?- nand(a,X).
false.
目標が不可能だと考えているか、後戻りしないかのどちらかであり、その理由はまったくわかりません。:/
誰かが私が間違っていることを知っていますか?
前もって感謝します。
PS:私も試しました:
nand(A,B) :- not(and(A,B)).
そして、それは同じ結果をもたらします。
編集:私の質問が一部の人にとって不可解であることを確認してください:
PROLOG に、and(A,B) を満たさない変数 A と B の値のリストを提供してもらいたい
EDIT2:PROLOGが教えてくれることを期待しています:
?- nand(a,X).
X = e ;
X = b.