我有问题:
我需要创建一个paradict“rightGuesses”,它将获得3个参数,每个参数都是一个字母列表,
例如:
rightGuesses([n,o,p,q], [p,r,o,l,o,g], Ans).
会给我们
Ans = [p, -, o, -, o, -].
我做了:
rightGuesses([],T2,[ANS])
rightGuesses([A|T1],T2,[ANS]):-
(member(A,T2))=\=true,
rightGuesses(T1,T2,[ _ |'-']).
rightGuesses([A|T1],T2,[ANS]):-
member(A,T2),
rightGuesses(T1,T2,[ _ |A]).
但我明白了:
ERROR: c:/users/leonid/desktop/file3.pl:5:0: Syntax error: Operator expected Warning: c:/users/leonid/desktop/file3.pl:6:
当我尝试编译它时,我的问题是什么,有没有更好的方法呢?
答案 0 :(得分:2)
在rightGuesses([],T2,[ANS])
之后你错过了一个点。我无法发现其他语法错误,但你有一个“语义”错误:这没有意义:(member(A,T2))=\=true
,而是使用\+member(A,T2)
。
答案 1 :(得分:1)
除了@CapelliC观察到的错误外,还有更多错误。就像[_|'-']
等等。
第一个观察是第二个和第三个参数是相同长度的列表。事实上,每个元素对应于另一个列表中相同位置的元素。所以我们对每个字母都有一个关系:guesses_letter_sofar/3
:
guesses_letter_sofar(Xs, C, -) :-
maplist(dif(C), Xs).
guesses_letter_sofar(Xs, C, C) :-
member(C, Xs).
使用all//1
作为:
guesses_letter_sofar(Xs, C, S) :-
phrase(( all(dif(C)), ({S=(-)}|[C],{S=C}) ).
现在,你的关系是:
rightGuesses(Guesses, Word, Sofars) :-
maplist(guesses_letter_sofar(Guesses), Word, Sofars).
或者,更详细地说:
rightGuesses(_Guesses, [], []).
rightGuesses(Guesses, [C|Cs], [Sofar|Sofars]) :-
guesses_letter_sofar(Guesses, C, Sofar),
rightGuesses(Guesses, Cs, Sofars).