diff options
Diffstat (limited to 'prolog/problems/denotational_semantics/prog_listswap_3')
-rw-r--r-- | prolog/problems/denotational_semantics/prog_listswap_3/common.py | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/prolog/problems/denotational_semantics/prog_listswap_3/common.py b/prolog/problems/denotational_semantics/prog_listswap_3/common.py index 3ad93e8..800717e 100644 --- a/prolog/problems/denotational_semantics/prog_listswap_3/common.py +++ b/prolog/problems/denotational_semantics/prog_listswap_3/common.py @@ -21,3 +21,30 @@ instr174((R0,C0)-->(R0,C)) --> instr174((R0,C0)-->(R,C0)) --> [swap], {swap(R0,C0,R)}.''' + +# nothing to do in this exercise +initial = '''\ +prog_listswap(In-->Out) --> + [begin], instructs((In,1)-->(Out,_)), [end]. + +% one instruction +instructs((R0,C0)-->(R,C)) --> + instr((R0,C0)-->(R,C)). +% sequence of instructions +instructs((R0,C0)-->(R,C)) --> + instr((R0,C0)-->(R1,C1)), + instructs((R1,C1)-->(R,C)). + +% "left" and "right" instructions move the cursor (but not outside list bounds) +instr((R0,C0)-->(R0,C)) --> + [left], + { C0 > 1, C is C0 - 1 ; C0 =< 1, C is C0 }. +instr((R0,C0)-->(R0,C)) --> + [right], + { length(R0, LenR0), (C0 < LenR0, C is C0 + 1 ; C0 >= LenR0, C is C0) }. + +% "swap" instruction swaps the element under cursor with the element on the left +instr((R0,C0)-->(R,C0)) --> + [swap], + { swap(R0, C0, R) }. +''' |