Điều bạn thực sự muốn có gì đó hơi khác: Bạn muốn đếm số câu trả lời (cho đến nay) của một mục tiêu.
Vị từ sau call_nth(Goal_0, Nth)
thành công như call(Goal_0)
nhưng có một đối số bổ sung cho biết câu trả lời được tìm thấy là câu trả lời thứ n. Định nghĩa này rất cụ thể đối với SWI hoặc YAP. Làm không phải sử dụng những thứ như nb_setarg/3
trong các chương trình chung của bạn, nhưng sử dụng chúng cho các trường hợp được gói gọn như trường hợp này. Ngay cả trong phạm vi hai hệ thống này, ý nghĩa chính xác của các cấu trúc này không được xác định rõ ràng cho trường hợp chung. Here is a definition for SICStus.
call_nth(Goal_0, C) :-
State = count(0,_), % note the extra argument which remains a variable
Goal_0,
arg(1, State, C1),
C2 is C1+1,
nb_setarg(1, State, C2),
C = C2.
Một trừu tượng mạnh mẽ hơn được cung cấp bởi Eclipse:
call_nth(Goal_0, Nth) :-
shelf_create(counter(0), CounterRef),
call(Goal_0),
shelf_inc(CounterRef, 1),
shelf_get(CounterRef, 1, Nth).
?- call_nth(between(1,5,I),Nth).
I = Nth, Nth = 1 ;
I = Nth, Nth = 2 ;
I = Nth, Nth = 3 ;
I = Nth, Nth = 4 ;
I = Nth, Nth = 5.
Vì vậy, chỉ đơn giản là quấn nó xung quanh:
lock_open :-
call_nth(conditional_combination(X), Nth),
X = [8,6,5,3,6,9],
!,
....
Tôi thấy một cách để thực hiện ** tập hợp ** O (N) trong khoảng thời gian ** và ** không gian bằng cách sử dụng nguyên thủy như vậy. Cảm ơn! – CapelliC
Phải suy nghĩ lại giới hạn/2 và bù đắp/2 triển khai, có lẽ vị từ nguyên thủy và phổ quát hơn sẽ là call_nth/2. –
Tôi không nhận ra rằng một mục tiêu có thể được gọi như vậy (dòng thứ ba của danh sách 'call_nth/2'). Tôi nghĩ người ta luôn cần 'gọi (Mục tiêu)', nhưng rõ ràng, chỉ là 'Mục tiêu' là đủ! –