tôi đã viết này như là một cách để giúp các giải pháp hạn chế mặc dù có những giải pháp vô hạn. Nhưng tôi nhận ra sẽ có một cách để sắp xếp lại các quy tắc để có được kết quả ngắn hơn trước.
Vì ad --> a, ad, d.
được đánh giá trước ad --> bc.
, hãy cố gắng đáp ứng ad --> a, ad, a.
trước ad --> bc.
. Tôi sẽ đặt ad --> bc.
trước ad --> a, ad, a.
. Điều tương tự cũng áp dụng cho các quy tắc bc --> b, b, bc, c, c.
và bc --> [].
Do arian đã chỉ ra quy tắc chấm dứt được áp dụng trước tiên, nên đảm bảo các giải pháp ngắn hơn được tìm thấy trước tiên.
Tôi cũng muốn chỉ ra rằng có hai giải pháp cho []
s và s -> quảng cáo -> bc -> [] Tôi sẽ loại bỏ s --> [].
vì nó không cần thiết.
Tất cả trong tất cả tôi sẽ cố gắng giải pháp này:
s --> ad.
a --> [a].
b --> [b].
c --> [c].
d --> [d].
ad --> bc.
bc --> [].
ad --> a, ad, d.
bc --> b, b, bc, c, c.
POST ORIGINAL:
Tôi phải bất lực nhìn lên thế nào để làm đếm (nó được một lúc kể từ khi tôi đã làm prolog) Nhưng có một số vô hạn và kể từ khi prolog cố gắng tìm tất cả các giải pháp nó không bao giờ ngừng tìm kiếm, mặc dù tôi chắc chắn bạn sẽ nhấn một chồng trên dòng chảy hoặc một số lỗi trước đó :).
Một cách để hạn chế số lượng kết quả là để giới hạn kích thước của giải pháp
phrase(s, X), length(X, 4).
Gets tất cả các giải pháp với chính xác 4 giá trị, đó sẽ là
X = [a, a, d, d]
X = [b, b, c, c]
tăng đến 6 sẽ mang lại :
X = [a, a, a, d, d, d]
X = [a, b, b, c, c, d]
Hoặc phạm vi sử dụng:
phrase(s, X), length(X, Y), Y >= 4 , Y < 10, Y != 6.
Tôi nghĩ, nếu tôi hiểu Câu hỏi của bạn, đó là vì có nhiều cây có thể được tạo, vì có các vòng trong ngữ pháp của bạn – Muggen
Và làm cách nào để khắc phục sự cố này? : -? – Simon