我对这个简单的 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 中调用挤压谓词时,一切都开始了,因此,在逻辑上,我必须验证挤压谓词是 TRUE 还是 FALSE ...
当规则主体中的所有内容为 TRUE 时, squeze谓词为 TRUE:它必须已读取一个字符(也是空白)并将此字符放在输出上并验证dorest(C)谓词是否为 TRUE(其中 C 是读取的字符)
dorest(C)是程序的核心。
IF C 是对应 a 的 ASCII 码字符 46。(句号):防止回溯(程序不能尝试其他 dorest 规则)并验证dorest为真,因此挤压谓词轮流验证为真,程序将结束
IF C是空白字符对应的ASCII码字符32:防止回溯(程序不能尝试其他dorest规则)验证get谓词会导致跳过所有空白字符,在当前输出流上写入C并验证挤压
如果 C 是一个普通字符,只需验证挤压(这会在读取字符串时引发类似循环)
所以,在这种情况下,我可以看到 CUT 运算符的使用!作为一种引出 IF 之类的方法,因为在dorest规则之间创建了互斥
是对的还是我错过了什么?