Prolog在第一个谓词中剪切运算符

时间:2013-04-02 02:18:27

标签: prolog

我在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.

我的疑问是:正如我所知,切割算子应当在信号左边的谓词为真时停止搜索替代词。第一个位置信号的含义是什么?为什么解释器会继续搜索可以将其他谓词设为真的其他值?

2 个答案:

答案 0 :(得分:2)

这种削减的效果是你的第二次野餐/ 1规则将被完全忽略。在你的计划生涯中,它永远不会有机会开火。

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

答案 1 :(得分:0)

Prolog的艺术,第11部分,剪切和否定“从操作上讲,剪切的处理方式如下。目标成功,并将Prolog提交给所有选择,因为父目标与剪切发生在该子句的开头统一了。 。”因此,一旦您的最高目标与您第一次野餐的头一一致,就无法再与您第二次野餐的头一统一。