Prolog 从句首删去

Prolog 从句首删去,prolog,prolog-cut,Prolog,Prolog Cut,考虑带有流模型(o)和谓词s的Prolog谓词p(整数)、q(整数)、r(整数): p(1). q(1). r(1). p(2). q(2). r(2). s:-!,p(X),q(Y),r(Z),write(X,Y,Z),nl. 给出以下目标的结果:s。证明答案的正确性 结果是111112121221222。我已经看到,如果削减是在条款的开头,就没有任何效果。这是真的吗 如果是在条款的开头,则删减无效。” 不完全正确。这将取决于该谓词是否有其他子句 此外: 谓词write是一元的,不能用三个

考虑带有流模型
(o)
和谓词
s
的Prolog谓词
p(整数)、q(整数)、r(整数)

p(1). q(1). r(1).
p(2). q(2). r(2).
s:-!,p(X),q(Y),r(Z),write(X,Y,Z),nl.
给出以下目标的结果:
s
。证明答案的正确性

结果是111112121221222。我已经看到,如果削减是在条款的开头,就没有任何效果。这是真的吗

如果是在条款的开头,则删减无效。”

不完全正确。这将取决于该谓词是否有其他子句

此外:

  • 谓词
    write
    是一元的,不能用三个参数调用
  • 最好在每个谓词的定义中对子句进行分组
正确的程序应该是:

p(1). p(2).
q(1). q(2).
r(1). r(2).

s :- !, p(X), q(Y), r(Z), writeln(X-Y-Z).
事实上,对于该程序,
cut
无效。 但是,考虑下面的新版本的程序。
p(1). p(2).
q(1). q(2).
r(1). r(2).

s :- !, p(X), q(Y), r(Z), writeln(X-Y-Z).
s :- writeln(here).                       % <= this clause will not be executed!
p(1)。p(2)。
q(1),q(2)。
r(1),r(2)。
s:-!,p(X),q(Y),r(Z),writeln(X-Y-Z)。
s:-写入(此处)。%
“如果是在条款的开头,则删减无效”

这不是真的(好吧,它在这里,但偶然)

cut的意思是“不要回溯到此处的左侧,而是使谓词失败”

因此,如果在当前子句之后出现其他子句(从词汇上讲),这意味着“提交谓词的当前子句,忽略任何其他子句”

您还可以将其理解为“保护动作”分隔符,执行“第一个保护胜出”逻辑,其中相应的保护动作(并且只有该动作)在保护成功时运行:

head1 :- guard1,!,action1.
head2 :- guard2,!,action2.
head3 :- guard3,!,action3.
head4 :- else_action.
对于
s/0
,实际上在
之前有一个空的保护,因此不进行保护测试,只对当前子句进行承诺。但是
s/0
只有一个子句,因此承诺不起任何作用