2016-12-15 52 views
1

任何人都可以告訴我,如果有更簡單的方法在Prolog中編寫此代碼,我需要縮小範圍以使其更加緊湊。Prolog簡化

這是我到目前爲止有:

add(X,[],[X]). 
add(X,[A|L],[A|L1]) :- 
    add(X,L,L1). 

head([X|_], X). 

exist(X,Y,A,B) :- 
    between(1, 8, X), 
    between(1, 8, Y), 
    between(1,8,A), 
    between(1, 8, B). 

exist(X/Y, A/B) :- 
    exist(X,Y,A,B). 

回答

0

首先,刪除head/2。 Prolog的模式匹配比此更短且更具可讀性。

其次,你想用add/3做什麼?在我看來,所有它會做的就是給你第二個列表的最後一個元素,如果他們碰巧有完全相同的元素,除了第二個元素有一個以上。換句話說,唯一成功的統一看起來像add(Z, [A,B,...,Y], [A,B...Y,Z]),我正在想象你可能需要的場景。

exist/4修復第3行的間距!對你的工作感到自豪! exist/4會產生你從1-8選擇的4個變量的所有排列。看起來很好,不知道爲什麼你需要它。

exist/2只是重新格式化exist/4,使它看起來像分數。再次,不知道爲什麼你需要它。

你想用這段代碼做什麼?這看起來像一堆奇怪而又不相關的工具。

+0

這是一個更大程序的一部分,它可以找到騎士在棋盤上的最短路徑。在我提交我的任務之前,我需要使代碼更簡潔,更簡潔。有什麼方法可以告訴你我到目前爲止的情況,並且可以指導我如何私下改進它。謝謝! ps。我在我的作品中修正了這個間距,之後我才發佈了這個... – zarrexx

+0

@zarrexx如果你只使用'exist/2',將'exist/4'的主體移到那裏並刪除'exist/4'。 –

+0

謝謝,有什麼方法可以將您的完整代碼發給您,您可以幫我解決問題嗎?因爲我不能在這裏發佈我的完整代碼 – zarrexx