以下是我正在处理的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).
我需要有能够改变字母顺序的发现者,直到找到一个好的匹配。当然,我可能需要几个以不同方式改变顺序的发现者。但我似乎无法得到的是如何
非常感谢任何帮助
答案 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.
我们希望用户词中的所有字母都是字母。我们还需要它们是独一无二的。就是这样。