2016-12-20 6 views
0

Prologで自分の条件を満たす最初のファクトを削除します。Prologで条件を満たす最初のファクトを削除します

5つの事実のうち1つだけを削除しようとしましたが、それは自分の目標と同じではありません。ここ

私の目標は、数4

否定では動作しませんカット操作でカードを維持することです。

明確な文章で、私の条件を満たす最初の事実であるこの事実(has(reem、blue、1))を削除したいと思います。

どうすればこの問題を解決できますか?

:- dynamic 
 
     has/3, first/2. 
 

 
has(reem,yellow,4). 
 
has(reem,blue,1). 
 
has(reem,red,5). 
 
has(reem,green,4). 
 
has(reem,blue,2). 
 

 

 
deleteCard(Player,Goal):- 
 
    retract(has(Player,_,Y)),not(Y=Goal),!. 
 

 
start:- 
 
    deleteCard(reem,4), 
 
    displayAll(reem). 
 

 
displayAll(Player):- 
 
\t nl, 
 
\t write('**LIST OF ALL CARDS YOU HAVE**'), 
 
\t nl, 
 
\t forall(has(Player,X,Y),(writeln(X+Y))).

+0

私はなぜそこにあなたが何をしたいのか、それは難しいあなたが何をしているかを理解することを見つけると、問題です。 –

+0

私が欲しいのは、条件(否定)でカットを使って最初の事実を得る方法を見つけることです、そして、もし私がこの事実を得たなら私はそれを削除します。 –

+0

明確な文章で、この事実(has(reem、blue、1))を削除したいと思います。 –

答えて

1

これが解決策です:

:- dynamic 
 
     has/3. 
 

 
has(reem,blue,2). 
 
has(reem,blue,1). 
 
has(reem,red,5). 
 
has(reem,yellow,4). 
 
has(reem,green,4). 
 

 

 
deleteCard(Player,Goal):- 
 
    has(Player,_,Y),not(Y=Goal),!,retract(has(Player,_,Y)). 
 

 
start:- 
 
    deleteCard(reem,4), 
 
    displayAll(reem). 
 

 
displayAll(Player):- 
 
\t nl, 
 
\t write('**LIST OF ALL CARDS YOU HAVE**'), 
 
\t nl, 
 
\t forall(has(Player,X,Y),(writeln(X+Y))).

関連する問題