2017-12-01 6 views
1

peanoの番号のプロローグで比較しようとしていますが、一部は間違っています。swi-prologで等しくない操作

誰もが私を助けることができるが、これは私のコードです:

%Not Equal 
notequal(0,s(A),X). 
notequal(s(A),0,X). 
notequal(s(A),s(B),C):- A/=B . 

OR

%Not Equal 
notequal(0,s(A),X). 
notequal(s(A),0,X). 
notequal(s(A),s(B),C):- minus(A,s(0),S1),minus(B,s(0),S2),notequal(S1,S2,C) . 

出力:

?- notequal(s(0),s(s(0)),S). 
false. 

?- notequal(s(0),0,S). 
true . 

?- notequal(0,s(0),S). 
true. 

まず出力間違っ

ありがとうございます。

答えて

4

このような述部には、2つの数値の間の関係をすべて記述した後に、3つの引数を必要としません。そして、あなたの最後のルールは再び述語自分自身を呼び出す必要があります。

notequal(0,s(_)). 
notequal(s(_),0). 
notequal(s(A),s(B)) :- % s(A) and s(B) are not equal if 
    notequal(A,B).  % A and B are not equal 

これは、あなたの希望の回答が得られますとして

?- notequal(s(0),B). 
B = 0 ; 
B = s(s(_G2450)). 

?- notequal(A,s(0)). 
A = 0 ; 
A = s(s(_G2450)). 

:また、インスタンス化だけで一つの引数でこれを使用することができます

?- notequal(0,0). 
false. 

?- notequal(0,s(0)). 
true. 

?- notequal(s(0),s(0)). 
false. 

?- notequal(s(s(0)),s(0)). 
true ; 
false. 

?- notequal(s(s(0)),0). 
true ; 
false. 

すべての可能性がこれら2つの答えでカバーされているのを見ることができます。最も一般的なクエリでは、ソリューションを生産している:

?- notequal(A,B). 
A = 0, 
B = s(_G2456) ; 
A = s(_G2456), 
B = 0 ; 
A = s(0), 
B = s(s(_G2460)) ; 
A = s(s(_G2460)), 
B = s(0) ; 
A = s(s(0)), 
B = s(s(s(_G2464))) ; 
. 
. 
. 
+1

は、Uをとても感謝します –

2

あなたは2つの数の実際の順序は、比較のベース—をソートするために、と言うだけで、安全な長期disequalityを述べる必要があり、使用—見つけるために必要がない場合広く利用できる組み込み述語dif/2

いくつかのサンプルクエリ:これも安全に最も一般的な場合で作品

?- dif(0, 0). 
false. 

?- dif(0, s(0)). 
true. 

?- dif(s(0), s(0)). 
false. 

?- dif(s(s(0)), s(0)). 
true. 

?- dif(s(s(0)), 0). 
true. 

?- dif(A, B). 
dif(A, B).    % residual goal indicates pending disequality constraint 
関連する問題