2011-03-13 100 views
4

在我的節目,我有這樣一些規則:關於prolog中的規則。 。

tellme(X) :- knows(X). 
tellme(friends1(X)) :- tellme(X). 
tellme(friends2(X)) :- tellme(X). 
tellme(friends3(X)) :- tellme(X). 
. 
. 
. 
tellme(friends25(X)) :- tellme(X). 

現在這個friends1,friends2,friends3 .....依賴於N的是一個變量。在這裏,例如,我的N的值是25.那麼是否可以編寫一個規則來生成這些規則直到N或我必須手動將這些規則寫入N次。歡迎任何建議或解決方案。非常感謝您的關注。

回答

1

對於每個N,您可能會使用二元函子friends(N,X)而不是一個函數。您可能想要更改tellmeknows也需要兩個參數。 (knows(X)對我沒有直接的意義,所以我不完全明白你的意思。)

如果由於某種原因,這不是你想要的,你可以使用類似的東西來創建一個新的函子(未經測試

friends_functor(N, Functor) :- 
    number(N), 
    atom_concat(friend, N, Functor). 

然後使用assertaassertz。不過,我真的不明白你爲什麼想要這樣做。

2

您可以使用term expansion在大多數現代Prolog環境中生成任何類型和數量的代碼,並從universal operator獲得一些幫助。以下示例適用於SWI:

term_expansion(gen_tellme(N), Terms) :- 
    findall((tellme(F) :- tellme(X)), 
      (between(1, N, I), atom_concat(friend, I, Fi), F =.. [Fi, X]), 
      Terms). 

gen_tellme(25). % generates 25 copies of the tellme clause. 

也就是說,將信息嵌入謂詞名稱,即朋友號碼通常不是一個好設計。爲什麼不用friend(N, X)重寫代碼,其中N是數字?

+0

但它給了我這個錯誤:錯誤:頂級:未定義的過程:gen_tellme/1(DWIM無法更正目標) – anilonwebs 2011-03-14 09:26:46

+0

@anilonwebs:您需要在同一個文件中同時查看兩個謂詞。第一個定義一個術語擴展規則,第二個使用它。 「gen_tellme()」是擴展的,它不會成爲一個真正的謂詞。不要在提示中嘗試。把它放在一個文件中。 – 2011-03-14 09:32:15

+0

查看基礎案例缺失的第一件事,即我的問題部分的第一條規則。所以我把它添加到一個文件中。 '告訴(X): - 知道(X).','知道你的定義規則(anil).'。但是當我對「tellme(friends1(anil))」進行查詢時,它給了我一個錯誤的結果。我已將所有代碼寫入單個文件。 – anilonwebs 2011-03-14 09:54:33