2011-09-04 64 views
1

晚上好可言,解决后我以前的问题解释here,我已经与Prolog的版本最后几个问题:转换C#中的Prolog代码:递归while循环

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

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

(A解决方案,它不工作)

[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). 

规则应与新的指标,并通过加1计数器返回OBJ 2:我该怎么办呢?

Tahnk你非常多, 马蒂亚

回答

0

我不明白你的问题完全。

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

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