2012-12-15 65 views
3

我有這個問題:Prolog的有關邏輯和語法初學者

我需要創建一個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:

當我嘗試編譯它什麼是我的問題,是有一個更好的辦法做到這一點?

+0

什麼是天堂? – CapelliC

+0

對不起,我的意思範例 – lnotik

+0

@Amith:你的編輯不是很有幫助,你沒有刪除'
' – false

回答

2

rightGuesses([],T2,[ANS])你錯過了一個點。我無法發現其他語法錯誤,但是您有'語義'錯誤:這不合理:(member(A,T2))=\=true,請改爲使用\+member(A,T2)

+0

謝謝你的答案CapelliC。 – lnotik

+1

此程序中還有更多錯誤... – false

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