我在排序Prolog中的任務列表[t7, t1, t6, t2, t4, t3, t5]
時遇到問題。爲了排序,我想使用預定義的公式predsort/3
,因爲它看起來像是正確的方法。predsort/3意外行爲
我自謂是這樣的:
sort_dependency(<, T, T2) :-
depends_on(T,T2,_).
sort_dependency(>, T, T2) :-
depends_on(T2,T,_).
sort_dependency(>, T, T2) :-
T == T2;
not(depends_on(T,T2,_)),
not(depends_on(T2,T,_)).
當測試這一點,我得到如下:
?- predsort(sort_dependency, [t7, t1, t6, t2, t4, t3, t5], Sorted).
Sorted = [t5, t4, t3, t7, t2, t6, t1] .
這是不正確的。正確的答案應該是[t1 , t2, t3, t4, t5, t6, t]
。 爲了測試目的,這裏是depends_on
的事實。
depends_on(t7,t2,0).
depends_on(t7,t6,0).
depends_on(t6,t4,0).
depends_on(t6,t5,0).
depends_on(t2,t1,0).
depends_on(t4,t3,0).
depends_on(t3,t1,0).
depends_on(t5,t3,0).
我試過在不同的變量周圍切換仍然無法得到預期的結果。是keysort/2
更好的選擇?問題是我沒有看到如何結合自定義謂詞來實現keysort。
「sort_dependency/3」的第3個子句究竟意味着什麼?我認爲它應該是'=='。但是,如果兩個物體不直接相互依賴,爲什麼兩個物體應該是相同的呢? – false
對我來說,我認爲這是因爲,如果兩個任務都是相同的,或者它們彼此不相互依賴,那麼使用'>'作爲謂詞。如果我用'sort_dependency(>,T,T2)'替換它,它應該是等價的,因爲如果前兩個子句都失敗了,第三個子句總是成立。如果我做這個改變,問題仍然是一樣的。 – Timbo925
這個名字應該是'compare_xxx',第一個參數必須是'>','<'或'=='。 – false