簡體   English   中英

如何檢查Prolog列表中的每個元素是否大於0?

[英]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).

讓我們逐行考慮一下這是如何工作的:

  1. 定義謂詞solution/1的第一子句,該子句采用包含X作為參數的單元素列表。
  2. 測試項目X是否為> 0 否則,謂詞將在此處終止並失敗。 否則,Prolog將繼續到下一行。
  3. 盡管不是嚴格必需的,但假設(第6行)的第二個子句也可以用輸入[X]執行,則此處的cut( ! )會刪除在(1)處會生成的選擇點Prolog。到[X|Y] ,其中Y = [] 因此,這僅是為了提高效率而進行的“降低”。
  4. 由於列表[X]包含全部大於零的元素,因此謂詞將打印一條消息並進行引用。
  5. 定義謂詞solution/1的第二個子句,該子句采用包含一個或多個項目的列表,其中X是列表的頭部, Y是列表的尾部(其余)(本身就是一個可以為空的列表) : [] )。
  6. 與第(2)行相同。
  7. 繼續遞歸測試列表的其余部分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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM