【问题标题】:Prolog Cut operator in the first predicate第一个谓词中的 Prolog Cut 运算符
【发布时间】:2013-04-02 02:18:26
【问题描述】:

我在 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 运算符应该在 ! 信号左侧的谓词为真时停止搜索备选方案。第一个位置的信号是什么意思?为什么解释器一直在寻找可以使其他谓词为真的其他值?

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,现在我明白了cut的意思了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多