【发布时间】:2016-12-21 03:15:16
【问题描述】:
我想删除在 Prolog 中满足我条件的第一个事实。
我试图删除其数量不等于我的目标的五个事实中的一个且仅一个。
我的目标是保留数字 4 的卡片。
cut 操作不适用于否定。
在一个明确的句子中,我想删除这个事实 (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):-
nl,
write('**LIST OF ALL CARDS YOU HAVE**'),
nl,
forall(has(Player,X,Y),(writeln(X+Y))).
【问题讨论】:
-
我很难理解你在做什么,你想做什么,为什么会出现问题。
-
我想要的是找到一种方法来使用带条件(否定)的切割来获得第一个事实,然后如果我得到这个事实,我将删除它。
-
用一个明确的句子我想删除这个事实(has(reem,blue,1))。通过使用削减和否定
-
这将删除编号为 4 的第一个事实,我想删除编号不等于 4 的第一个事实。
-
但是如果你想撤回
has/3的一个子句,你为什么要写retract(first(...))呢?不应该是retract(has(...))吗?