将C#转换为Prolog代码:循环时递归

时间:2011-09-04 18:53:31

标签: c# recursion prolog

晚上好,在解决了我之前解释的here问题之后,我在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的计数器:我该怎么办?

非常感谢你, 马蒂亚

1 个答案:

答案 0 :(得分:0)

我完全不接受你的问题。

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

无论给予字符串S0S1common(S0, S1, I0, I1)I0I1S0的第一个共同字符的位置统一起来分别和S1。如果没有,则失败。您可以添加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程序。他们将不同的代码从一个代码转换为另一个代码,并以目标语言获得合理的代码。