2017-02-14 56 views
1

有人能告訴我我的If If else在我的搜索中,在子列表中有什麼問題。如果在序言中有其他錯誤條件

因爲當大小爲0時,條件工作,但如果值變爲1,2和3,它會出現錯誤,但關係運算符不正確?

如果可變長度的大小= 0,則條件起作用,但如果可變長度的大小爲3,則它有錯誤。

錯誤是:

例外:> =π/ 2:參數不能充分地實例化。

subList([], []). 
subList(List1,List2):- 
     concatenate(List1,List2,Result1), 
     equalelements(Result1,Result2), 
     counting(Result2,Length), 
     Length =< 2 
    -> false 
    ; Length >= 3 
    -> true. 

searchdisease([],_). 
searchdisease(Symptoms,Disease) :- 
    disease(Ls, Disease), 
    subList(Symptoms, Ls). 

counting([ ],0). 
counting([_| T], N) :- 
    counting(T, N1), 
    N is N1 + 1. 

concatenate(L1, L2, NL) :- 
    append(L1, L2, L12), 
    msort(L12, NL). 
+0

Lenght是列表大小的返回變量,返回大小爲0的時間,返回大小爲1或大小爲2,3,4等的時間。所以我檢查列表的大小是否小於或等於2或更大或等於3. –

+0

我縮進了你的規則:現在你看到'Length'對於'Length> = 3'是沒有實際意義的' – false

+0

長度是謂詞Counting的返回值,它返回變量長度中的列表大小。 –

回答

1

這是運營商優先考慮的常見問題。請注意,Prolog會忽略您使用的精確縮進。相反,它需要考慮到運營商。所以你需要相應地添加圓括號。

最可能的是你想要的以下內容:

subList([], []). 
subList(List1,List2):- 
    concatenate(List1,List2,Result1), 
    equalelements(Result1,Result2), 
    counting(Result2,Length), 
    ( Length =< 2 
    -> false 
    ; Length >= 3 
    -> true 
    ). 

在另一方面,爲什麼不簡單地通過一個單一的目標取代了Length的比較:Length >= 3

+1

現在我明白了,它工作。謝謝。 –