3

我有这个问题:

我需要创建一个paradict“rightGuesses”,它将获得3个参数,每个参数都是一个字母列表,

  1. 猜到的字母列表
  2. 我不得不猜的词
  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:

当我尝试编译它时,我的问题是什么,有没有更好的方法呢?

4

2 回答 2

2

rightGuesses([],T2,[ANS])你错过一个点之后。我无法发现其他语法错误,但您有一个“语义”错误:这没有意义:(member(A,T2))=\=true,请\+member(A,T2)改用。

于 2012-12-15T17:02:20.750 回答
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).
于 2014-04-20T21:16:48.623 回答