2015-10-16 54 views
1

我有一個數字塊:序言:在列表比較數字

num(1). 
num(-2). 
num(5). 
num(50). 
num(-3). 
num(87). 

我應該做的是給定一個數它應該檢查這個數字是最小的那個「功能列表「的數字。

例如:

not_smallest(5). 
true. 

not_smallest(X). 
X = 1 ; 
X = -2 ; 
X = 5 ; 
X = 50 ; 
X = 87. 

我認爲是做與數字的上面塊列表,並比較給定數量到列表中的所有元素。 但每當我嘗試加載特等DOC我得到這個錯誤:

Syntax error: Operator expected 

是我迄今所做的是這樣的:

%increments the index of a List 

incr(X, X1) :- 
    X1 is X + 1. 

%L-list containing "list" of numbers, N - elements of that "list", 
I-index , C-number X is going to be compared to, X- number to compare. 

nao_menor(X) :- 
    findall(N, num(N), L), 
    num(X), 
    I is 0, 
    nth0(I, L, C), 
    X =< C, 
    incr(I,I). 
+0

「 %'字符指定了一個註釋行(不能有換行符),所以你應該在行'I-index ....'的開頭加'%'或者把這兩行放在一行中 – gusbro

+0

也是你的'nao_menor/1'程序將無法按預期工作。 (例如'incr(I,I)'將始終失敗) – gusbro

+0

我剛剛添加了%來指定變量是什麼,它不在原始代碼中,但是感謝您的支持。 – eXistanCe

回答

1

這裏,我們去:

not_smallest(N) :- 
    num(N), 
    \+ \+ (num(M), M < N). 

由OP給出的示例查詢:

?- not_smallest(5). 
true. 

?- not_smallest(X). 
    X = 1 
; X = -2 
; X = 5 
; X = 50 
; X = 87. 
+1

難道我不能這樣做嗎? – eXistanCe

+0

@eXistanCe。我不太明白你想用'findall'做什麼,後面跟着'nnth0'。 'findall'沒有排序,'setof' OTOH沒有... – repeat

+0

這個想法並不是對值進行排序,它只是將它們放在一個列表中,因此findall然後將任何值與列表中存儲的值進行比較。如果他不小於任何列表元素,則返回true,如果是false,則返回false – eXistanCe