Prolog为初学者提供有关逻辑和语法的知识

时间:2012-12-15 15:40:01

标签: prolog

我有问题:

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

  1. 猜测字母列表
  2. 我必须猜测
  3. 这个词
  4. 到目前为止猜到的字母。
  5. 例如:

    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:

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

2 个答案:

答案 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).