![](/img/trans.png)
[英]How to check if next element in a list is greater than the previous in Haskell?
[英]How to check if each element in Prolog list is greater than 0?
我有以下Prolog謂詞原型:solution(+ InputVector),其中InputVector是未知長度值的列表。 如果列表中的所有值均大於0,則打印出一條消息。 我該怎么做呢?
如果您有興趣將學習范圍擴展到“高階”謂詞,請考慮maplist / 2:
3 ?- maplist(<(0), [1,2,3]).
true.
4 ?- maplist(<(0),[0,1,2,3]).
false.
嘗試檢查列表是[]還是[X | Xs],並采取相應措施。
你快到了 考慮以下內容(感謝@aBathologist更新):
1| solution([X]) :-
2| X > 0,
3| !,
4| write_ln('Success!').
5| solution([X|Y]) :-
6| X > 0,
7| solution(Y).
讓我們逐行考慮一下這是如何工作的:
solution/1
的第一子句,該子句采用包含X
作為參數的單元素列表。 X
是否為> 0
。 否則,謂詞將在此處終止並失敗。 否則,Prolog將繼續到下一行。 [X]
執行,則此處的cut( !
)會刪除在(1)處會生成的選擇點Prolog。到[X|Y]
,其中Y
= []
。 因此,這僅是為了提高效率而進行的“降低”。 [X]
包含全部大於零的元素,因此謂詞將打印一條消息並進行引用。 solution/1
的第二個子句,該子句采用包含一個或多個項目的列表,其中X
是列表的頭部, Y
是列表的尾部(其余)(本身就是一個可以為空的列表) : []
)。 Y
請注意,以上定義假定solution/1
必須僅在數字大於零的非空列表上成功。 如果您希望允許該謂詞在空列表上成功執行,則可以使實現更加簡單:
solution([]) :-
write_ln('Success!').
solution([X|Y]) :-
X > 0,
solution(Y).
在此版本中, solution/1
的兩個子句之一是根據以下參數執行的:第一個處理空列表,第二個處理大於零的非空列表。 由於謂詞參數是不可統一的( []
\\ = [X|Y]
),因此Prolog不會為第一個子句的任何調用生成選擇點,因此在此處不必使用cut( !
)。
我希望這對您有所幫助,並為您提供了一些Prolog語法的語義。
我將這樣寫謂詞:
all_greater_than_zero([]).
all_greater_than_zero([H|T]) :-
H > 0,
all_greater_than_zero(T).
我以為空列表是可以接受的。 如果不是,則可以刪除第一個子句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.