簡體   English   中英

Prolog統一清單

[英]Prolog Unifying List

在過去的幾個小時里,我一直在篡改這段代碼。

該函數應該做的是從當前狀態(X / Y)返回下一個可達狀態的列表。 Obs是無法到達狀態的列表, N是行數, M是列數。

所以successors(2/2, X)的典型回答是: X = [ (1, [3/2]), (1, [1/2]), (1, [2/3])| (1, [2/1])]. X = [ (1, [3/2]), (1, [1/2]), (1, [2/3])| (1, [2/1])].

到目前為止,如果所有謂詞都為真,我可以使用的代碼,並返回正確的輸出。 但是,如果任何后繼輔助謂詞錯誤,則失敗。

succesors(X/Y, Succs):-
   loadMazeInfo(maze1), %loading the maze info
   maze(_, M, N, Obs, _, _), %obtaining the S and G states.
   successorsRight(X/Y, Succs, Obs, M, N).

successorsRight(X/Y, [(1, [S1/Y])|T], Obs, M, N):-
   successorsLeft(X/Y, T, Obs, _, N), S1 is X + 1, M >= S1, not(member(S1/Y, Obs)).
successorsLeft(X/Y, [(1, [S1/Y])|T], Obs, _, N):-
   successorsUp(X/Y, T, Obs, _, N), S1 is X - 1, S1 >= 1, not(member(S1/Y, Obs)).
successorsUp(X/Y, [(1, [X/S2])|T], Obs, _, N):-
   successorsDown(X/Y, T, Obs, _, _), S2 is Y + 1, N >= S2, not(member(X/S2, Obs)).
successorsDown(X/Y, (1, [X/S2]), Obs, _, _):-
   S2 is Y - 1, S2 >= 1, not(member(X/S2, Obs)).

我想知道是否有辦法告訴prolog跳過謂詞如果它是假的,並轉到下一個。 或者這是無法實現的,我正在完全解決這個問題? 我不理解切割,但在這種情況下我不認為它們對我有用,或者是嗎?

我認為你'過度指定'邏輯。 您應該簡化程序,分解重復的代碼,並讓Prolog搜索可用的步驟。 然后findall / 3將幫助您構建結果列表

succesors(X/Y, Succs):-
  loadMazeInfo(maze1), %loading the maze info
  maze(_, M, N, Obs, _, _), %obtaining the S and G states.
  findall((1,SX/SY), (successor(X, Y, SX, SY, M, N), not(member(SX/SY, Obs))), Succs).

successor(X, Y, S1, Y, M, _):-
  S1 is X + 1, M >= S1.
successor(X, Y, S1, Y, _, _):-
  S1 is X - 1, S1 >= 1.
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM