大家晚上好,在解决了我之前在这里解释的问题之后,我还有几个关于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
我不太明白你的问题。
- 你的对象是如何定义的?特别是,getChar()返回什么?
- 为什么对象会出现在Prolog代码中?Prolog不是面向对象的。
无论如何,给定字符串S0
和S1
, common(S0, S1, I0, I1)
分别用S0
和S1
的第一个公共字符的位置来统一I0
和I1
。如果没有,它就失败了。您可以添加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程序。它们之间的差异太大,无法将代码从一种转换到另一种,从而得到合理的目标语言代码。