【问题标题】:Some doubts about the use of the cut in a program that read and format an input text in Prolog关于在 Prolog 中读取和格式化输入文本的程序中使用 cut 的一些疑问
【发布时间】:2013-04-17 11:46:09
【问题描述】:

我对这个简单的 Prolog 示例的声明性解释有一些疑问,该示例从当前输入流中读取一个句子并重新格式化输出相同的句子,以便将单词之间的多个空格替换为单个空格字符。

这是我的程序的代码:

squeeze :- get0(C),    % Legge un carattere dallo standard input(anche blank)
           put(C),     % Scrive il carattere sullo standard output
           dorest(C).  % Fà tutto il resto.

dorest(46) :- !.   % 46 è il carattere ASCII per lo stop: tutto completato.

dorest(32) :- !,       % 32 è il carattere ACII per blank, impedisci backtrack
              get(C),  % Legge un carattere dallo standard input (non blank)
              put(C),  % Scrive il carattere sullo standard output
              dorest(C).  % Fà tutto il resto.

dorest(Letter) :- squeeze.

我对它的陈述性阅读和剪辑的使用有一些疑问......你能告诉我我的解释是正确的还是我遗漏了什么?

当我在 Prolog Shell 中调用 squeeze 谓词时,一切都开始了,因此,在逻辑上,我必须验证 squeeze 谓词是 TRUE 还是 FALSE...

squeze 谓词在规则正文中的所有内容为 TRUE 时为 TRUE:它必须已读取一个字符(也是空白)并将该字符放在输出中并验证是否 dorest (C) 谓词为 TRUE(其中 C 是读取字符)

dorest(C)是程序的核心。

IF C 是对应的 ASCII 码字符 46 。 (句号):防止回溯(程序不能尝试其他 dorest 规则)并验证 dorest 为真,因此 squeeze 谓词轮流验证为 TRUE 并且程序将结束

IF C 是 ASCII 码字符 32 对应一个空白字符:防止回溯(程序不能尝试其他 dorest 规则)验证 get 谓词会导致跳过所有空白字符,在当前输出流上写入 C 并验证 squeeze

如果 C 是一个普通字符,只需验证挤压(这会在读取字符串时引发类似循环)

所以,在这种情况下,我可以看到 CUT 运算符的使用!作为一种引出 IF 之类的方法,因为在 dorest 规则之间创建互斥

是对的还是我错过了什么?

【问题讨论】:

  • 面对I/O,没有更多的逻辑阅读。 I/O 本质上是程序性的。
  • 不是TRUEFALSE,而是“成功”或“失败”。

标签: prolog


【解决方案1】:

是的,你是对的,这里确实使用 cut 来创建 IF 构造。这段代码可以用'->' construct 显式重写:

squeeze :- get0(C), put(C), dorest(C).

dorest(C):-
  (  C = 46 -> true ;
     C = 32 -> get(C), put(C), dorest(C) ;
     squeeze
  ).

可以看出,squeezedorest 是相互递归的过程。 squeeze 做某事,然后调用dorest,它要么停止,做某事,要么回拨squeeze

因此,这个程序描述了一个循环,它读取用户输入直到遇到一个点,然后回显每个字符,除了对于任何空白字符序列,只有第一个空格字符被回显,这使得它看起来像是将几个连续的空格“挤”成一个空格:

9 ?- squeeze.
|: 12 34   56
12 34 56
|: asd  432 123-432   56.
asd 432 123-432 56.

Yes
10 ?- squeeze.
|: 123   43 23   .rewe ew wew ew e
123 43 23 .

Yes

这是一种操作解释,而不是声明性解释。 I/O 是关于“做”,而不是关于“存在”。这就是为什么我在上面使用“程序”一词代替“谓词”。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多