小编Fel*_*ine的帖子

Prolog继承符号表示不完整的结果和无限循环

我开始学习Prolog,并首先了解了继承符号.

这就是我在Prolog中发现编写Peano公理的地方.

参见PDF的第12页:

sum(0, M, M).
sum(s(N), M, s(K)) :-
    sum(N,M,K).

prod(0,M,0).
prod(s(N), M, P) :-
    prod(N,M,K),
    sum(K,M,P).
Run Code Online (Sandbox Code Playgroud)

我把乘法规则放到了Prolog中.然后我做查询:

?- prod(X,Y,s(s(s(s(s(s(0))))))).
Run Code Online (Sandbox Code Playgroud)

这意味着基本上找到6的因子.

结果如下.

X = s(0),
Y = s(s(s(s(s(s(0)))))) ? ;
X = s(s(0)),
Y = s(s(s(0))) ? ;
X = s(s(s(0))),
Y = s(s(0)) ? ;
infinite loop
Run Code Online (Sandbox Code Playgroud)

这个结果有两个问题:

  1. 并非所有结果都显示,请注意结果X = 6,Y = 1缺失.
  2. 它不会停止,除非我按Ctrl + C然后选择中止.

所以...我的问题是:

  1. 这是为什么?我尝试转换"prod"和"sum".结果代码给了我所有结果.再说一遍,为什么?它仍然是死循环.
  2. 如何解决?

我在无限循环中阅读了另一个答案.但我很感激有人根据这个场景做出回答.这对我很有帮助.

prolog infinite-loop successor-arithmetics non-termination failure-slice

41
推荐指数
2
解决办法
2855
查看次数

C#Rijndael解密返回额外的问号字符

我正在组织一些非常基本的对称加密/解密代码以供将来使用.我能够成功加密和解密...只有一个小问题.

这是我的代码,它从流中读入并解密到另一个流:

public void Encrypt(Stream input, Stream output) {
    byte[] key = Encoding.UTF8.GetBytes(_pw);
    byte[] iv = Encoding.UTF8.GetBytes(GenerateInitVector());
    RijndaelManaged rm = new RijndaelManaged();
    CryptoStream cs = new CryptoStream(
        output,
        rm.CreateEncryptor(key, iv),
        CryptoStreamMode.Write);
    int data;
    while ((data = input.ReadByte()) != -1)
        cs.WriteByte((byte) data);
    cs.Close();
}

public void Decrypt(Stream input, Stream output) {
    byte[] key = Encoding.UTF8.GetBytes(_pw);
    byte[] iv = Encoding.UTF8.GetBytes(GenerateInitVector());
    RijndaelManaged rm = new RijndaelManaged();
    CryptoStream cs = new CryptoStream(
        input,
        rm.CreateDecryptor(key, iv),
        CryptoStreamMode.Read);
    int data;
    while ((data = cs.ReadByte()) != -1) …
Run Code Online (Sandbox Code Playgroud)

c# encryption cryptography rijndaelmanaged

3
推荐指数
1
解决办法
1273
查看次数

加权图问题,对/错+解释

我正在尝试回答一些对/错问题。当我用 true 回答其中许多问题时,我感到很担心...请假设所有图表都是无向的并且没有不同的权重。负权重应该没问题。

Qa) 如果 G 具有一个具有唯一最重边 e 的环,则 e 不能是任何 MST 的一部分。

我的回答是真的。例如,我们有一个包含节点 A、B、C、D、E 的图。

AB = 1
BC = 2
BD = 3
CD = 100
DE = 4
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,BCD是一个循环。我的观点是,既然是一个循环,我们总是可以通过走其他路线来避免独特的最重边缘CD。因此这是真的。我的论点合理吗(足够)吗?

Qb) Dijkstra 算法计算出的最短路径树必然是 MST。

我的回答是对的,但我的直觉告诉我有些不对劲。嗯...Disjkstra 和 Prim 都是贪婪算法。他们每次都追求最轻的边缘。是否存在最短路径树不是最小生成树的情况?我实际上很难理解这两个人之间的区别。

Qc) Prim 的算法适用于负加权边。

我的回答是真的。因为这就是 wiki 所说的... :p 该算法是为了在所有边中找到成本最低的边。所以负加权边缘应该不重要,不是吗?但是负加权循环又如何呢?

Qd) 如果 G 具有一个具有唯一最轻边 e 的循环,则 e 必须是每个 MST 的一部分。

我的回答是真的。我们必须访问 MST 中的所有节点。例如,在长度为 3 的循环中,我们总是可以用 2 步遍历该循环中的所有节点。如果有一个独特的最轻边缘,我们肯定会在 MST 中选择它。

我的主张合理吗?也许他们还不够?那么有什么建议吗?

graph weighted

2
推荐指数
1
解决办法
2万
查看次数