查找具有不同顺序的单词中的字母

时间:2012-03-10 15:02:26

标签: prolog

以下是我正在处理的prolog程序的说明:

用户可以输入5个字母的单词,并且允许的唯一字母是a,b,c,d,e。他可能不输入所有单词,因此他可以输入类似userWord(A,b,C,d,E)的内容 - 因此只填写b和d。这些字母可以按任何顺序输入。我必须在不使用列表或函数的情况下完成这项工作,并且只使用基础事实。

这就是我所拥有的:

values(a,b,c,d,e).

userWord(U,W,X,Y,Z):-
    values(A1,A2,A3,A4,A5),
    findletters(U,W,X,Y,Z,A1,A2,A3,A4,A5).   % U-Z are outputs and A1-A5 are inputs


findletters(A1,A2,A3,A4,A5,A1,A2,A3,A4,A5):-
    findletters(A2,A1,A3,A4,A5,A1,A2,A3,A4,A5).

我需要有能够改变字母顺序的发现者,直到找到一个好的匹配。当然,我可能需要几个以不同方式改变顺序的发现者。但我似乎无法得到的是如何

  1. 调用具有可能值的发现者
  2. 让它记住值只有a,b,c,d,e
  3. 使它生成它生成的最后一个订单(失败了)并对其进行处理并更改订单,直到找到匹配为止。
  4. 非常感谢任何帮助

4 个答案:

答案 0 :(得分:0)

进一步打破谓词,使用letter(a). letter(b). ... letter(e).这将有助于找到只输入有效字母。

也许像这样使用它:

userWord(A,B,C,D,E) :-
    letter(A), letter(B), ...,letter(E), /* this will fail here on 
                                            non-valid letter */
    .... /* if it gets here the letters form a valid(?) word */

或者,如果你想输入,你可以为'abcde':)的所有组合添加事实,或者你可以让prolog生成它:word(AA,BB,CC,DD,EE):- letter(AA), ..., letter(EE).这将生成像'aaaaa'这样的“单词”不是你想要的,在这种情况下你需要在word() - 子句中加上AA!=BB,AA!=CC,...,DD!=EE.

答案 1 :(得分:0)

values(a,b,c,d,e).


userWord(A,B,C,D,E):-
    values(A,B,C,D,E).
userWord(A,B,C,D,E):-
    reArr(A,B,F,G),reArr(B,C,H,I),reArr(C,D,J,K),reArr(D,E,L,M).
    userWord(F,G,I,K,M).

reArr(X,Y,X,Y):-X<Y.            %For this check the variables must be bound and must be converted into ASCII code..
reArr(X,Y,X,Y):-reArr(Y,X,Y,X).

我认为上述逻辑可以帮助您...尝试并发布您的成功代码..

谢谢, 紧紧抓住:)

答案 2 :(得分:0)

这可能毫无意义,但只需拨打电话即可解决您的任务:

userWord(A,B,C,D,E) :- permutation([a,b,c,d,e], [A,B,C,D,E]).

置换5个不同的值需要120个事实。

手工做到这一点是不合理的。如果您被允许作弊,那么使用permutation / 2生成所有事实,并断言它们,或者写入Prolog文件,以便进行咨询。

对不起,我不知道比排列/ 2更简单的算法,我期待看到这样的算法或一些有趣的技巧是否存在。

答案 3 :(得分:0)

实际上,它比我想象的容易。

letter(a).
letter(b).
letter(c).
letter(d).
letter(e).

userword(V, W, X, Y, Z) :-
  letter(V),
  letter(W),
  letter(X),
  letter(Y),
  letter(Z),
  V \= W,
  V \= X,
  V \= Y,
  V \= Z,
  W \= X,
  W \= Y,
  W \= Z,
  X \= Y,
  X \= Z,
  Y \= Z.

我们希望用户词中的所有字母都是字母。我们还需要它们是独一无二的。就是这样。