转换c#到Prolog代码:递归while循环

本文关键字:递归 while 循环 代码 Prolog 转换 | 更新日期: 2023-09-27 18:07:23

大家晚上好,在解决了我之前在这里解释的问题之后,我还有几个关于Prolog版本的最后一个问题:

  • 比较规则:给定两个自定义对象,该方法查找它们之间的第一个相等字符。

    int index = myObject1.Index;
    char myChar = myObject1.getChar();
    while ((index < 6) && !(myObject2.getChar().Equals(myChar)))
    {
        index++;
        myChar= myObject1.getCharAt(index);
    }
    myObject1.Counter++;
    

(一个不工作的解决方案)

[Closing rule]
compare_rule(I,Obj1,Obj2) :-
getChar(Obj2,Char2),
getChar(Obj1,Char1),
Char1 == Char2;
I == 6.
[Recursive rule]
compare_rule(I,Obj1,Obj2) :-
getChar(Obj2,Char2),
getChar(Obj1,Char1),
    I < 6, Char1 == Char2,
    I1 is I+1,
    compare_rule(I1,Obj1,Obj2).

规则应该返回Obj2与新的索引和计数器增加1:我怎么能做到这一点?

非常感谢。Mattia

转换c#到Prolog代码:递归while循环

我不太明白你的问题。

  • 你的对象是如何定义的?特别是,getChar()返回什么?
  • 为什么对象会出现在Prolog代码中?Prolog不是面向对象的。

无论如何,给定字符串S0S1, common(S0, S1, I0, I1)分别用S0S1的第一个公共字符的位置来统一I0I1。如果没有,它就失败了。您可以添加I0 < 6,以获得S0的前6个字符的解决方案。

common([C|_], S1, 1, I) :-
    contains(C, S1, I).
common([C|S0], S1, I0, I1) :-
    '+ contains(C, S1, I),
    common(S0, S1, I, I1),
    I0 is I + 1.
contains(C, [C|_], 1).
contains(C, [C0|T], I) :-
    C '= C0,
    contains(C, T, I0),
    I is I0 + 1.

我猜你不应该把 c#转换成Prolog。相反,应该考虑c#程序的功能,并构建具有相同效果的Prolog程序。它们之间的差异太大,无法将代码从一种转换到另一种,从而得到合理的目标语言代码。