【问题标题】:Delete the first fact that fulfills a condition in Prolog删除满足 Prolog 中条件的第一个事实
【发布时间】: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(...))吗?

标签: prolog fact


【解决方案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):-
	nl,
	write('**LIST OF ALL CARDS YOU HAVE**'),
	nl,
	forall(has(Player,X,Y),(writeln(X+Y))).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多