对于在Prolog中读取和格式化输入文本的程序中使用cut有一些疑问

对于在Prolog中读取和格式化输入文本的程序中使用cut有一些疑问,prolog,Prolog,我对这个简单的序言示例的声明性解释有一些疑问,这个示例从当前输入流中读取一个句子,并输出经过重新格式化的同一个句子,以便用单个空白字符替换单词之间的多个空格 这是我的程序代码: squeeze :- get0(C), % Legge un carattere dallo standard input(anche blank) put(C), % Scrive il carattere sullo standard output dores

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

这是我的程序代码:

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中调用挤压谓词时,所有这些都开始了,因此,在逻辑上,我必须验证挤压谓词是真还是假

squeze当规则体中的所有内容都为真时,谓词为真:它必须已读取一个字符(也是空的),并将此字符放在输出上,并验证dorest(C)谓词是否为真(其中C为读取字符)

dorest(C)是该计划的核心

如果C是对应于a的ASCII码字符46。(句号):防止回溯(程序无法尝试其他dorest规则)并验证dorest为true,因此挤压谓词依次验证为true,程序将结束

如果C是在空白字符处对应的ASCII码字符32:防止回溯(程序无法尝试其他最新规则)验证将导致跳过所有空白字符的get谓词,在当前输出流上写入C,并验证挤压

如果C是一个公共字符,只需验证压缩(这会导致类似于读取字符串的循环)

因此,在这种情况下,我可以看到切割操作符的使用!作为一种引入类似IF的方法,因为在和最新的规则之间创建互斥


这是对的还是我遗漏了什么?

是的,你是对的,这里确实使用了cut来创建IF构造。此代码可以使用以下命令重新编写:

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

dorest(C):-
  (  C = 46 -> true ;
     C = 32 -> get(C), put(C), dorest(C) ;
     squeeze
  ).
可以看出,
squere
dorest
是相互递归的过程<代码>压缩执行某项操作,然后调用
dorest
,该操作可以停止、执行某项操作,也可以调用
压缩
返回

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

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是关于“做”,而不是关于“存在”。这就是为什么我用“过程”一词代替上面的“谓词”。

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