2

我在 Prolog 中有以下基础:

holiday(friday,may1).
weather(friday,fair).
weather(saturday,fair).
weather(sunday,fair).
weekend(saturday).
weekend(sunday).

picnic(Day) :- !,weather(Day,fair), weekend(Day).
picnic(Day) :- holiday(Day,may1).

当我运行时,picnic(When).我得到以下跟踪:

[trace]  ?- picnic(When).
   Call: (6) picnic(_G716) ? creep
   Call: (7) weather(_G716, fair) ? creep
   Exit: (7) weather(friday, fair) ? creep
   Call: (7) weekend(friday) ? creep
   Fail: (7) weekend(friday) ? creep
   Redo: (7) weather(_G716, fair) ? creep
   Exit: (7) weather(saturday, fair) ? creep
   Call: (7) weekend(saturday) ? creep
   Exit: (7) weekend(saturday) ? creep
   Exit: (6) picnic(saturday) ? creep
When = saturday ;
   Redo: (7) weather(_G716, fair) ? creep
   Exit: (7) weather(sunday, fair) ? creep
   Call: (7) weekend(sunday) ? creep
   Exit: (7) weekend(sunday) ? creep
   Exit: (6) picnic(sunday) ? creep
When = sunday.

我的疑问是:据我所知,cut 运算符应该在!左侧的谓词时停止搜索替代方案。信号为真。第一个位置的信号是什么意思?为什么解释器一直在寻找可以使其他谓词为真的其他值?

4

2 回答 2

3

该削减的效果是您的第二条 picnic/1 规则将被完全忽略。在您的程序生命周期内,它永远不会有机会触发。

但是在可用的替代方案(切线右侧的目标)中,回溯仍然在起作用,您可以在跟踪中清楚地观察到它们。

于 2013-04-02T02:53:23.527 回答
0

Prolog 的艺术,第 11 部分,剪切和否定 “操作上,剪切处理如下。目标成功并将 Prolog 提交给所有选择,因为父目标与剪切发生的子句的头部统一。” 因此,一旦您的首要目标与您的第一次野餐/1 的负责人统一,它就不能与您的第二次野餐/1 的负责人统一。

于 2020-08-07T09:55:15.100 回答