2016-12-20 8 views
0

Я хочу удалить первый факт, который выполняет мое условие в Prolog.Удалить первый факт, который выполняет условие в Prolog

Я попытался удалить один и только один из пяти фактов, что его число не соответствует моей цели.

Моя цель здесь, чтобы держать карты с номером 4.

Операция сокращения не работает с отрицанием.

В ясном предложении я хочу удалить этот факт (имеет (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

В ясном предложении я хочу удалить этот факт (имеет (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))).